GVKun编程网logo

pybitcointools源码分析之比特币交易数据结构(比特币源码分析教程)

23

本文将带您了解关于pybitcointools源码分析之比特币交易数据结构的新内容,同时我们还将为您解释比特币源码分析教程的相关知识,另外,我们还将为您提供关于Bitcoin区块和交易数据结构、bit

本文将带您了解关于pybitcointools源码分析之比特币交易数据结构的新内容,同时我们还将为您解释比特币源码分析教程的相关知识,另外,我们还将为您提供关于Bitcoin 区块和交易数据结构、bitcoin交易所 全球十大比特币交易所分别是哪些?、BitCoin比特币的疯狂:如何选择一家合适的比特币交易平台、centos7 安装比特币客户端——bitcoin的实用信息。

本文目录一览:

pybitcointools源码分析之比特币交易数据结构(比特币源码分析教程)

pybitcointools源码分析之比特币交易数据结构(比特币源码分析教程)

需要了解的背景知识

首先要了解比特币的两种脚本类型:

P2PKH(pay-to-public key-hash)和P2SH(pay-to-scrip-hash)

这部分可以在 <<精通比特币>>书中找到介绍,同时P2SH这个标准来源于比特币扩展协议BIP16,我之前翻译过这个协议,有兴趣可以看下:

http://www.voidcn.com/article/p-ffadanrq-bny.html

另外需要了解下比特币脚本的执行原理,可以参考我以前写的一篇博客:

http://www.voidcn.com/article/p-mlewxqea-bca.html

开始分析代码

#输入测试数据
inputs = [{
            ''output'': ''cd6219ea108119dc62fce09698b649efde56eca7ce223a3315e8b431f6280ce7:0'',''value'': 158000
   }]

#输出测试数据
outputs = [
            [{''address'': addr0,''value'': 1000},{''address'': addr1,''value'': 2000}]
]

for outs in outputs:
    mktx(inputs,outs)

inputs和outputs是测试数据,要用于比特币交易的输入和输出。

直接看mktx函数。函数创建一笔比特币交易的数据结构。用字典表示,序列化后返回。先看下它返回的结果:

0100000001e70c28f631b4e815333a22cea7ec56deef49b69896e0fc62dc198110ea1962cd0000000000ffffffff02e8030000000000001976a914d99f84267d1f90f3e870a5e9d2399918140be61d88acd00700000000000017a9140136d001619faba572df2ef3d193a57ad29122d98700000000

看着不太好理解,因为这是序列化之后的值,序列化之前是字符串形式的字典,可读性好,如下:

{''locktime'': 0,''version'': 1,''outs'': [{''value'': 1000,''script'': ''76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac''},{''value'': 2000,''script'': ''a9140136d001619faba572df2ef3d193a57ad29122d987''}],''ins'': [{''sequence'': 4294967295L,''outpoint'': {''index'': 0,''hash'': ''cd6219ea108119dc62fce09698b649efde56eca7ce223a3315e8b431f6280ce7''},''script'': ''''}]}

根据比特币的协议, 比特币的交易(tx)结构是这样的,

tx消息描述一笔比特币交易

字段尺寸 描述 数据类型 说明
4 version uint32_t 交易数据格式版本
1+ tx_in var_int 交易的输入数
41+ tx_in tx_in[] 对前一输出的引用
1+ tx_out count var_int 交易的输出数
8+ tx_out tx_out[] 交易输出或比特币去向列表
4 lock_time uint32_t 锁定交易的期限或block数目。如果为0则交易一直被锁定。未锁定的交易不可包含在block中,并可以在过期前修改(目前bitcon不允许更改交易,所以没有用)

和上面的结果对应下,除了输入数和输出数都可以对应上,两个数目之所以没有是因为可以根据list长度自动计算。

进入mktxs内部剥茧抽丝,来看看究竟是如何组装一笔交易的。

def mktx(*args):
    # [in0,in1...],[out0,out1...] or in0,in1 ... out0 out1 ...

    ins,outs = [],[]
    for arg in args:
        if isinstance(arg,list):
            for a in arg:
                (ins if is_inp(a) else outs).append(a)
        else:
            (ins if is_inp(arg) else outs).append(arg)


    # 字典表示交易对象,初始化locktime等字段
    txobj = {"locktime": 0,"version": 1,"ins": [],"outs": []}

    for i in ins:

        if isinstance(i,dict) and "outpoint" in i:
            txobj["ins"].append(i)
        else:
            if isinstance(i,dict) and "output" in i:
                i = i["output"]

            txobj["ins"].append({
                "outpoint": {"hash": i[:64],"index": int(i[65:])},"script": "","sequence": 4294967295
            })


    for o in outs:
        if isinstance(o,string_or_bytes_types):
            addr = o[:o.find('':'')]
            val = int(o[o.find('':'')+1:])
            o = {}
            if re.match(''^[0-9a-fA-F]*$'',addr):
                o["script"] = addr
            else:
                o["address"] = addr
            o["value"] = val

        outobj = {}
        if "address" in o:
            outobj["script"] = address_to_script(o["address"])
        elif "script" in o:
            outobj["script"] = o["script"]
        else:
            raise Exception("Could not find ''address'' or ''script'' in output.")
        outobj["value"] = o["value"]
        txobj["outs"].append(outobj)

    return serialize(txobj);

函数不长,前面提到一个tx里包含多个tx_in和tx_out,函数首先初始化一个tx对象,

txobj = {"locktime": 0,"outs": []}

然后主要的工作就是组装tx_in和tx_out了。内容来源于我们的测试数据,作为参数传递过来。

tx_in和tx_out数据结构如下:

tx_out的构成:

字段尺寸 描述 数据类型 说明
8 value uint64_t 交易的比特币数量(单位是0.00000001)
1+ pk_script var_int pk_script的长度
? pk_script uchar[] Usually contains the public key as a Bitcoin script setting up conditions to claim this output

tx_in的构成:

字段尺寸 描述 数据类型 说明
36 prevIoUs_output outpoint 对前一输出的引用
1+ script length var_int signature script 的长度
? signature script uchar[] 用于确认交易授权的计算脚本
4 sequence uint32_t 发送者定义的交易版本,用于在交易被写入block之前更改交易

outpoint是对前一输出的引用。

OutPoint结构的构成:

字段尺寸 描述 数据类型 说明
32 hash char[32] 引用的交易的散列
4 index uint32_t 指定输出的索引,第一笔输出的索引是0,以此类推

我打印的txobj[‘ins’]和txobj[‘outs’]如下:

txobj[ins]:[{''sequence'': 4294967295L,''script'': ''''}] txobj[outs]:[{''value'': 1000,''script'': ''a9140136d001619faba572df2ef3d193a57ad29122d987''}]

里面有个函数address_to_script,需要说明下。

def address_to_script(addr):
    if addr[0] == ''3'' or addr[0] == ''2'': 
        return mk_scripthash_script(addr)
    else:
        return mk_pubkey_script(addr)

从名字可以看出,该函数的功能时把地址转换为脚本,到底是什么意思呢?我们一步步来分析。
if判断部分,比特币地址中’3’或者’2’开头的是P2SH 地址(Pay-to-Script-Hash),其它的地址按照P2PKH(Pay-to-Public-Key-Hash)方式处理。

P2PKH是比特币网络中最常用的脚本形式,我们就以它为例进入mk_pubkey_script函数中看下:

def mk_pubkey_script(addr):
    # Keep the auxiliary functions around for altcoins'' sake
    return ''76a914'' + b58check_to_hex(addr) + ''88ac''

就一行实现。b58check_to_hex是base58解码操作。我们知道比特币地址是这样计算的:

A = RIPEMD160(SHA256(K))

A就是比特币地址,但是A并不是我们通常看到的比特币地址,我们平时看到那个是为了增加可读性经过base58编码的。

函数中的b58check_to_hex(addr)其实就是解码转回A。为啥要转成A呢? 接续看,

76 a9 88 ac 是比特币脚本的四个指令对应的16进制编码,分别表示

  • 0x76:OP_DUP(复制栈顶元素)

  • 0xa9:OP_HASH160(栈顶项进行两次HASH,先用SHA-256,
    再用RIPEMD-160)

  • 0x88:OP_EQUALVERIFY(与OP_EQUAL 一样,如结果为0,之后运行
    OP_VERIFY)

  • 0xac:OP_CHECKSIG (交易所用的签名必须是哈希值和公钥的
    有效签名,如果为真,则返回1)

所以,mk_pubkey_script返回的脚本是:

OP_DUP OP_HASH160 0x14 A OP_EQUALVERIFY  OP_CHECKSIG

如果你了解比特币脚本的运行机制,这个看起来就很眼熟了。没错这就是比特币UTXO中的锁定脚本。而根据锁定脚本的标准,A的位置放入的是16进制的比特币地址,也就是base58编码之前的值。

看下实际运行的结果。比如这里的示例,传递的参数是:

1Lqgj1ThNfwLgHMp5qJUerYsuUEm8vHmVG

address_to_script输出:

76a914d99f84267d1f90f3e870a5e9d2399918140be61d88ac

Bitcoin 区块和交易数据结构

Bitcoin 区块和交易数据结构

图来自http://learnmeabitcoin.com/guide/blockchain

区块链是一种账本数据库,分布式,数据存储的每个节点都会同步复制整个账本,信息透明难以篡改。

区块中存放着交易,区块按照高度有序链接起来的这种数据结构被称为区块链。每个区块都指向前一个区块,一个区块由 区块头 和 交易 组成。

区块

区块由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易列表组成。区块结构如图:

图来自http://learnmeabitcoin.com/glossary/

区块头中数据有:

  • 区块版本
  • 前个区块哈希
  • Merkle Root 哈希
  • 时间戳
  • Bits 难度
  • Nonce “挖矿” 随机数

Coinbase 交易:每个区块中的第一条交易都是 Coinbase 交易,用于奖励 “矿工” 将交易打包到区块。奖励分为两部分,一是区块奖励,一是区块中除 Coinbase 交易外其它交易手续费总和。

<!--more-->

区块头

区块头的长度是80字节,将区块头数据进行两次 Sha256 运算将得到区块哈希

区块头结构如下:

Field Size Data
Version 4 bytes Little-endian ⟲
Previous Block Hash 32 bytes Little-endian ⟲
MerkleRoot 32 bytes Little-endian ⟲
Timestamp 4 bytes Little-endian ⟲
Bits (Difficulty Target) 4 bytes Little-endian ⟲
Nonce 4 bytes Little-endian ⟲

Merkle Root

Merkle Tree 是一种哈希二叉树,用于归纳一个区块中的所有交易,同时生成整个交易集合的数字签名,且提供了一种校验区块是否存在某交易的高效途径。

区块链中的每个区块都包含了产生于该区块的所有交易,且以Merkle树表示。那么如何获得它呢?

  1. 从区块交易列表中获取每对Txid,并对它们进行两次 Sha256 运算,得到哈希。
  2. 如果为奇数,则复制一份凑成偶数再进行两次 Sha256 运算,得到哈希。
  3. 递归1、2,直到最终获得一个哈希,它就是Merkle Root。

图来自http://learnmeabitcoin.com/glossary/merkle-root

为什么使用 Merkle Root 方式呢,为什么不对区块内所以交易一次性进行哈希呢,那样不是更快么?

使用 Merkle Root 原因有二:

  1. 完整性验证,任何一个节点的哈希发生变化,都会导致最终的 Root 节点哈希发生变化。这一特性也可用于快速定位问题节点。
  2. 零知识证明,如下图,16 条交易的节点能够通过生成一条仅有 4 个 32 字节哈希值长度(总128字节)的 Merkle 路径,来证明区块中存在一笔交易 K,该路径有4个哈希值 HL、HIJ、HMNOP 和 HABCDEFGH。由这4个哈希值产生的认证路径,再通过计算另外四对哈希值 HKL、HIJKL、HIJKLMNOP 和 Merkle Root,任何节点都能证明 HK 包含在Merkle Root。

图来自https://github.com/bitcoinbook/bitcoinbook/

关于 Merkle 路径,我们来看一张图:

交易数量 区块大小 路径数量 路径大小
16 4 KB 4 128 bytes
512 128 KB 9 288 bytes
2048 512 KB 11 352 bytes
4096 1 MB 12 384 bytes
65,535 16 MB 16 512 bytes

即使增长到交易数量为 262144,区块大小到 65M,路径数也才 18。所以使用 Merkle Root 非常高效,如果是所有交易进行一次哈希,虽然获得 Hash 是快些,但对于要验证问题交易或节点,将是个灾难。

Bits 和 Nonce

Bits 是挖矿目标难度 Target 的紧凑格式。

Nonce 是挖矿遍历时的随机数。

关于 “挖矿” 的具体内容,我会单独总结一篇,感兴趣可以关注后续文章。
这里有一个在线的模拟挖矿,各种数据显示都很直观,适合了解挖矿内部运作:点我前往模拟挖矿

交易

目前存在两种交易结构。比特币白皮书中定义的交易结构和新的隔离见证交易结构。

BIP 141 定义一种新的交易结构,我们称之为 “Segregated Witness (隔离见证)” 交易。旧交易结构签名数据放在交易输入里,隔离见证交易则将签名数据 “分离” 出来,放在交易的 Locktime 之前。

交易结构:

[nVersion] [n] [tx inputs] [n] [tx outputs] [nLockTime]
    |       |               |                    |
 4 bytes  varint          varint             4 bytes

隔离见证(Segregated Witness)交易结构:

[nVersion] [marker] [flag][n] [tx inputs] [n] [tx outputs] [witness][nLockTime]
    |       \    /   \  /  |               |                \     /     |
 4 bytes     0x00    0x01 varint         varint            scriptSig  4 bytes
Field Size Data
Version 4 bytes Little-endian ⟲
* Marker 1 bytes 0x00
* Flag 1 bytes 0x01
Input Counter 1–9 bytes VarInt
Inputs Variable
Output Counter 1–9 bytes VarInt
Outputs Variable
* Witness Variable
Locktime 4 bytes Little-endian ⟲

* 为 Segregated Witness 交易字段。

我们解析一条 Segregated Witness (P2SH-P2WPKH)交易:

如果你对 P2SH-P2WPKH 交易感兴趣可以查看我之前写的一篇介绍 Segregated Witness 的文章。

{
  "txid": "af0c4cdd2537ae367b0e03db0cd795fa37543bd672c9234b2c307009a9a8108f",
  "hash": "ff300093626745127aad29e8628ee4606b87cb660f7ff63817dd4857cd15a175",
  "version": 2,
  "size": 248,
  "vsize": 166,
  "locktime": 0,
  "vin": [],
  "vout": []
}

HEX 数据:

Inputs

交易输入结构:

Field Size Data
TXID 32 bytes Little-endian ⟲
VOUT 4 bytes Little-endian ⟲
ScriptSig Size 1–9 bytes VarInt
ScriptSig Variable
Sequence 4 bytes Little-endian ⟲

输入JSON:

{
  "txid": "6635d3f451478f0e1f88692d5cfb9194f133fbb314cb87fa9483f89bd296284b",
  "vout": 0,
  "scriptSig": {
    "asm": "0014db75523757a256579a197746568f331103417b85",
    "hex": "160014db75523757a256579a197746568f331103417b85"
  },
  "txinwitness": [
    "3045022100c8b2a6027f939bb964e395c94cd6f1d8ff9d1f406e41975b2ac979a6007c3ac4022019953dfe376d0152152955e02d72e7a7b9a61f8d5700642c97a2dc4ba13628b801",
    "02983f3687310bcfe2ad1ad55d011112c3f8d659950c10cab9ff43ae34d7b6280e"
  ],
  "sequence": 4294967293
}

outputs

交易输出结构:

Field Size Data
Value 8 bytes Little-endian ⟲
ScriptPubKey Size 1–9 bytes VarInt
ScriptPubKey Variable

输出JSON:

{
  "value": 1.00000000,
  "n": 0,
  "scriptPubKey": {
    "asm": "OP_HASH160 2228cecac3c1fa3143ba2ac7d2525d8b9b05c87b OP_EQUAL",
    "hex": "a9142228cecac3c1fa3143ba2ac7d2525d8b9b05c87b87",
    "reqSigs": 1,
    "type": "scripthash",
    "addresses": [
      "2MvMqrBRct4F2zuyrpgrq2qqq61VZc1znPB"
    ]
  }
},
{
  "value": 48.99996680,
  "n": 1,
  "scriptPubKey": {
    "asm": "OP_HASH160 22e2f5339cdf0778935e8127dc51e4a0ae62d162 OP_EQUAL",
    "hex": "a91422e2f5339cdf0778935e8127dc51e4a0ae62d16287",
    "reqSigs": 1,
    "type": "scripthash",
    "addresses": [
      "2MvRgr7SeyTVutrUaJdmZ5ETVdoPp5eWoj5"
    ]
  }
}

VarInt

比特币使用可变字节表示脚本长度,当一个字节不够表示时,如下规律:

Size Example Description
<= 0xfc 0x12 1 个字节
<= 0xffff 0xfd1234 前缀是fd,小端表示接下来的2个字节
<= 0xffffffff 0xfe12345678 前缀是fe,小端表示接下来的4个字节
<= 0xffffffffffffffff 0xff1234567890abcdef 前缀是ff,小端表示接下来的8个字节

如:0x48,没有 fdfeff 前缀,所以我们知道它是2 bytes表示的。

VarInt: 0x48
        = 72 bytes

如:fd2606,因为是 fd 前缀,我们读取fd之后的 4 bytes,反转小端再转换为十进制表示。

VarInt: 0xfd2606
        = 0x2602    (next 2 bytes)
        = 0x0226    (Little-Endian)
        = 550 bytes

Little-Endian

小端 (Little-endian) 字节序。如:0x12345678

大端类似于十六进制字节从左到右的阅读顺序。小端最低位字节是 0x78 存储在最低的内存地址处,后面的字节依次往后存。

Big-Endian:    |12|34|56|78|
Little-Endian: |78|56|34|12|

比特币在很多地方数据都是用小端序表示。

参考

  • https://github.com/bitcoinboo...
  • http://learnmeabitcoin.com/gl...
  • http://learnmeabitcoin.com/gl...
  • http://learnmeabitcoin.com/gl...
  • http://yogh.io
  • http://royalforkblog.github.i...

bitcoin交易所 全球十大比特币交易所分别是哪些?

bitcoin交易所 全球十大比特币交易所分别是哪些?

bitcoin交易所 全球十大比特币交易所分别是哪些?

全球十大比特币交易所分别是哪些?

有领域王国,币安、火币、BitMEX、聚币这些吧,不过目前国内的比特币交易平台之中,只有领域王国是受到了新西兰和美国的双重监管的。

北京有比特币交易所吗?

北京没有比特币交易所。比特币在互联网平台上交易。

如果交易平台倒闭,比特币还在吗?

如果是在正规平台买的,那么就算交易所倒闭了,比特币也依然还在,只不过交易所倒闭之前你把币提走就可以了;但如果是在非正规平台买的,那么你可能压根买的就不是BTC,很有可能是一堆数字,那也就无所谓在不在了。

美国比特币交易所有几个?

美国比特币较出名币圈交易所有Coinbase、Binance、CoinSwitch等11家左右

币圈交易所什么时候成立?

是2011年6月9日。三大交易所是指biteb中国OKhbi,例如比特币中国BTCChina币圈三大交易所,成立于2011年6月9日。

币圈三大交易所,是一个由上海萨图西网络有限公司运营币圈三大比特币交易所交易所,比特币交易平台虚拟货币交易所虚拟货币的三大交易所,是指biteb中国OKhbi虚拟货币。

以上就是bitcoin交易所 全球十大比特币交易所分别是哪些?的详细内容,更多请关注php中文网其它相关文章!

BitCoin比特币的疯狂:如何选择一家合适的比特币交易平台

BitCoin比特币的疯狂:如何选择一家合适的比特币交易平台

我个人是一位比特币玩家,现在挖矿基本入不敷出了,所以想玩比特币就只能去交易平台了,目前国内平台不下十家之多,良莠不齐,所以选择一家合适的平台显得尤为重要了。我以我的切身经历给大家阐述怎么去选择交易平台,希望对大家有所帮助。我第一次听说比特币的时候是在2011年,那个时候对比特币一点也不了解,于是在网上收集了一些资料,这才对比特币有了一些了解,也对它产生了一些兴趣,于是就像弄几个比特币玩玩,别人介绍去交易所买一些比特币,但是不知道去哪里买,也不了解各个交易平台, 就随便入驻了国的一家交易平台。

从2012年到2013年初比特币呈现出了强劲的上涨势头,我手里的10几个币也有2000美金的样子了,可是平台上交易了一段时间发现平台有很多问题,例如挂单延迟,眼睁睁的看着错过下单机会;继而出现了更多的问题,网站打不开、客服效率低、资金安全、充值提现非常非常慢,更有甚提现好几天都没人理,严重的影响了正常交易,我决定换一家新的平台,必须保证下单准确,快速充值、提现,于是我开始在国内的几个交易所中进行比较,最终我选择了国内另一家比特币交易平台OKCoin(https://okcoin.com)。在这期间我也总结一些选择交易所的原则,不妨在这里介绍给大家,也好给大家一种参考。暂且以OKCoin为例来阐述我的选择原则,首先声明一下,每个人都有自己的判断,OKCoin只是我的选择结果,不具有代表性,我的这篇文章也没有否定其他平台的意思。只要把握住自己的选择原则就可以了。

1.平台交易量

这个肯定排第一,没有交易量的平台就是死盘子,价格不涨不跌,或者暴涨暴跌。几个币就能成庄家了,很容易被庄家操作,所以这个因素非常的重要,目前OKCoin的每天的交易量有500多(https://okcoin.com首页顶部就能看到,一般的交易平台都会给出交易信息来的),相信以后还会更多。所以这个符合我的选择条件。

2.平台运营能力

一个平台没有盈利能力,只能靠吃客户沉淀资金为生,没有背后强大的资金支持,无疑是相当危险的。这个道理大家都应该懂的。据我所了解OKCoin拥有100W美金的天使投资,是公司运营的,有完整的运营团队,来自百度、谷歌、搜狐等团队,相信平台的盈利以及运营能力肯定没有问题。

3.平台交易手续费

这个手续费的问题是比较现实的问题,在可以接受的情况下选择手续费较低的,如果有免费的那就更好了,可是我从来都不相信什么免费的东西。OKCoin的手续费在国内这几家交易平台来说算是可以接受的,只有0.3%,所以在我的选择范围之内。

4.充值取现的便捷度

尽量选择充值自动化一点的平台,取现选择按时到账的,兼顾手续费的考虑,充值提现一定要快捷,否则你会发现你体现了大半天没动静,让你干着急。我在OKCoin进行了几次充值发现他们的充值都是自动化的,根本不需要人工的干预这就大大的提高了效率,也避免了人工出错的情况出现。最重要的是OKCoin充值可以即时到帐,提现第二天到账,这一点我非常喜欢。目前大多数平台能够做到充值即时到帐,但是提现速度就很难说了。

5.交易行情变动情况

从理论上来说,贴近符合MT行情的比较符合,不能MT涨了,半天还没反应,这样盘子不好操作,这个归根还是成交量的问题。OKCoin能够紧跟MT的价格,所以这也是我选择OKCoin的另一个重要原因,这条因素不必细说。

6.交易平台的客服工作

一个交易平台是否把客户当上帝,取决于他们客服团队的素质,有些公司跟客服说话一两个小时回一句,这难免让人有些费解,这也是我选择离开某China的一个重要的原因,人们在涉及到金钱资金的问题大多是人都是比较谨慎,想把问题问的明明白白,这就要求客服有足够的耐心,以及过硬的专业素质。经过几次简单的接触我发现OKCoin的客服也应该是比特币的玩家,因为几次聊天觉得OKCoin客服对比特币了解颇多,希望客服能继续保持。

7.交易平台安全保障

这条原则也是重中之重,不管你买比特币是为了赚钱还是屯着,平台必须得足够的安全,没有安全一切都等于零,没有安全保障前面几条再好也没用。首先OKCoin网站是有国家工信部ICP备案的,而且是企业备案,可信度比较高;再者OKCoin采用了SSL加密,可能有的人不知道什么是SSL,当你打开网站的时候注意地址栏里是https://www.okcoin.com,http后面有一个s,这就是SSL加密,保证信息传输不被窃听;他们采用了分布式服务器技术,这样就具有更强的坑攻击能力;最重要的是他们完全采用冷存储,也就是离线存储,最大限度的保证了资金的安全。

以上就是我总结选择比特币交易平台的原则,还是那句话仁者见仁智者见智,适合自己的才是最好的,说句公道话,OKCoin这家平台的确值得信赖。最后提醒大家比特币交易没有涨停跌停,24小时开放,所以入市要谨慎啊。

centos7 安装比特币客户端——bitcoin

centos7 安装比特币客户端——bitcoin

bitcoin安装

安装依赖环境

sudo yum install -y autoconf automake libtool libdb-devel boost-devel libevent-devel

下载

github上找到对应版本。这里下载0.18版本源代码。

wget https://github.com/bitcoin/bitcoin/archive/0.18.zip

解压zip

如果linux服务器没有安装解压程序,则执行以下命令安装:

yum install unzip

解压zip包

unzip 0.18.zip

进入bitcoin-0.18目录

cd ./bitcoin-0.18

运行autogen.sh,生成configure文件

./autogen.sh

运行configure,生成Makefile

./configure

如果出现如下错误,则是缺少C++编译器。

configure: error: C++ compiler cannot create executables

安装c++编译器。

yum install gcc-c++

继续执行configure命令,如果出现以下错误,则是缺少Berkeley DB。

configure: error: libdb_cxx headers missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)

安装Berkeley DB

安装Berkeley DB依赖环境

sudo yum install -y libtool-ltdl libtool-ltdl-devel gcc openssl openssl-devel

下载Berkeley DB 4.8以上版本

https://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index-082944.html
这里安装4.8.30版本。

wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz

将文件放置/usr/local/src/目录下,解压:

tar xvzf db-4.8.30.tar.gz

创建berkeleydb目录:

mkdir /usr/local/berkeleydb 

进入目录:

cd /usr/local/berkeleydb

安装并指定安装目录:

./../src/db-4.8.30/dist/configure --prefix=/usr/local/berkeleydb --enable-cxx
make && sudo make install

安装完成后,配置Berkeley DB的链接库

echo ''/usr/local/berkeleydb/lib/'' >> /etc/ld.so.conf

ldconfig

Berkeley DB安装完成

继续bitcoin操作

回到bitcoin安装目录继续之前操作:

./configure LDFLAGS="-L/usr/local/berkeleydb/lib/" CPPFLAGS="-I/usr/local/berkeleydb/include/"
make
make install

至此bitcoin客户端安装完毕,输入bitcoin-cli命令验证一下

$ which bitcoin-cli
/usr/local/bin/bitcoin-cli
$ bitcoin-cli -version
Bitcoin Core RPC client version v0.18.0.0-ge57462c6ba6023e0ed5417067364dcea2f88b36d

生成文件

安装完成后在/usr/local/bin目录下会生成6个可执行文件:

  • bench_bitcoin:根据https://github.com/bitcoin/bitcoin/issues/829 解释,作用是编译系统更新,也就是检查系统使用的一些加密算法是否有新的更新。
  • bitcoin-cli:是Bitcoind的一个功能完备的RPC客户端,包括查询区块,交易信息等等,具体将在相应章节介绍。
  • bitcoind:是比特币运行的核心程序俗称bitcoin core。
  • bitcoin-tx:比特币交易处理模块,支持交易的查询和创建。
  • bitcoin-wallet:比特币钱包。
  • test_bitcoin:运行各个模块的测试代码。

配置启动

创建配置文件

创建目录和配置文件

mkdir -p ~/.bitcoin
touch ~/.bitcoin/bitcoin.conf

配置内容:

# 接受JSON-RPC请求
server=1
# 是否是独立进程, 守护进程
daemon=1

# If run on the test network instead of the real bitcoin network
# testnet=0    # 这里设置成为1,就是 测试网络.

# You must set rpcuser and rpcpassword to secure the JSON-RPC api
# Please make rpcpassword to something secure, `5gKAgrJv8CQr2CGUhjVbBFLSj29HnE6YGXvfykHJzS3k` for example.
# Listen for JSON-RPC connections on  (default: 8332 or testnet: 18332)
# rpc 用户名
rpcuser=testuser
# 密码
rpcpassword=123456
# 允许访问i
rpcallowip=127.0.0.1
# 端口
rpcport=8332

# 数据存储位置
datadir=/mnt/btc_data

执行启动命令:

bitcoind -conf=~/.bitcoin/bitcoin.conf
或
bitcoind
# 因为会默认寻找当前用户下.bitcoin/bitcoin.conf的配置文件

停止程序:

bitcoin-cli stop

查看日志,日志位于datadir目录下的debug.log文件内。


程序新视界

关注程序员的职场生涯,大量优质学习资源、技术文章分享

csdn-微信公众号

本文同步分享在 博客“程序新视界”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

关于pybitcointools源码分析之比特币交易数据结构比特币源码分析教程的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Bitcoin 区块和交易数据结构、bitcoin交易所 全球十大比特币交易所分别是哪些?、BitCoin比特币的疯狂:如何选择一家合适的比特币交易平台、centos7 安装比特币客户端——bitcoin的相关知识,请在本站寻找。

本文标签: