精通比特币(上)

最开始接触区块链的时候就是同学让我读一下《精通比特币》,由于当时对区块链的很多内容不了解,所以,只是囫囵吞枣的看了一遍,没有留下太多的印象。现在随着区块链知识的深入学习以及前面有仔细的读了一遍比特币白皮书。所以,这里重读一遍,相信有更多的体会。

1. 难度调整

整个网络每产生2,106个区块后会根据之前2,106个区块的算力进行难度调整。

[注] 大约十分钟出一个块,那么大约2106*10/60/24=14.625天难度调整一次

2. 流通中的比特币数量非常接近一条曲线,并将在2140年比特币将达到2,100万枚。

[注] 这里是通过从最开始每个区块奖励50枚比特币,之后每新建210000个区块,则减半一次,直到奖励减小为1聪,这样来进行计算得来的。

3. 每笔交易你都可以使用不同的地址,这有利于提高隐私的安全性。用户可创建地址的数量几乎不受限制。

[注] 但是当每个地址的金额很小,支出需要多个地址的金额进行汇总开支付的时候,创建的这个多个输入一个输出的交易就会暴露你控制着哪些地址,以及这些地址里面有过哪些交易。

4. 钱包应用甚至可以在完全离线时建立交易。就像在家里写张支票,之后放到信封发给银行一样,比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。

[注] 比特币网络就是交易的集合。当执行交易的时候就是将交易发送到网络上。

5.交易的输出会被创建成为一个包含这笔数额的脚本的形式,只能被引入这个脚本的一个解答后才能兑换。简单点说就是,Alice的交易输出会包含一个脚本,这个脚本说 “这个输出谁能拿出一个签名和Bob的公开地址匹配上,就支付给谁”。因为只有Bob的钱包的私钥可以匹配这个地址,所以只有Bob的钱包可以提供这个签名以兑换这笔输出。因此Alice会用需要Bob的签名来包装一个输出。

[注] 本质上,比特币网络不会维护未花费的输出列表,网络中只有交易记录。所以,我们所谓的可以使用的“比特币”,是前面交易记录的输出。如果有很多输出,也钱包或节点会遍历所有以我们的地址为输出的交易,来计算我们拥有的金额,即未花费输出UXTO。

6. 这个工作量证明算法指的用SHA256加密算法不断地对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解。第一个找到这个解的矿工会赢得这局竞赛并会将此区块发布到区块链中。

[问题] 所有的矿工计算的是同一个问题吗?每次计算除了自己的这个随机数之外还有什么内容?

7. 它会立刻将一些交易和这个新区块的数字指纹放在一起开始构建下一个新区块,并开始给它计算工作量证明。

[注] 每个矿工计算的这里提到的交易是相同的吗?

8. 安装相关命令

获取比特币客户端代码: $ git clone https://github.com/bitcoin/bitcoin.git

获取代码标签(版本): $ git tag

$ git checkout v0.9.0rc1

生成一个构建脚本: $ ./autogen.sh

帮助文档: $ ./configure --help

发现所有必要的库: $ ./configure

进行编译: $ make

安装: $ sudo make install

查询路径: $ which bitcoind $ which bitcoin-cli

运行: $ bitcoind

以后台模式运行 bitcoind: $ bitcoind -daemon

9. 运行相关命令

查看可用的比特币RPC命令列表: $ bitcoin-cli help

获得比特币核心客户端状态的信息: $ bitcoin-cli getinfo

设置密码为foo: $ bitcoin-cli encryptwallet foo

解锁钱包和设定解锁时间: $ bitcoin-cli walletpassphrase foo 360

钱包备份: $ bitcoin-cli backupwallet wallet.backup

导入备份文件: $ bitcoin-cli importwallet wallet.backup

将钱包转储为人类可读的文本文件: $ bitcoin-cli dumpwallet wallet.txt

获得其中的一个地址: $ bitcoin-cli getnewaddress

询问bitcoind客户端此地址已经接收到的比特币数额,以及指定该数额要被加到余额中所需要的确认数: $ bitcoin-cli getreceivedbyaddress 1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL 0

整个钱包接收到的交易: $ bitcoin-cli listtransactions

列出整个钱包的所有地址:$ bitcoin-cli getaddressesbyaccount ""

显示所有经过至少minconf个确认的交易加和后的余额:$ bitcoin-cli getbalance

获取某一地址的交易: $ bitcoin-cli gettransaction 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3

获取地址对应的原始十六进制的交易数据: $ bitcoin-cli getrawtransaction 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3

通过区块高度来检索一个区块,这样需要将区块高度作为参数,并返回那个区块的区块哈希值: $ bitcoin-cli getblockhash 0

查看我们钱包中所有剩余的从之前交易中已确认的支出:$ bitcoin-cli listunspent

得到未花费的输出的详细细节: $ bitcoin-cli gettxout 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3 0

建立一笔交易。我们将交易的收入(50已确认未支出的mBTC)和两笔交易的输出(送往新地址的比特币和从原先账户找回的零钱)作为createrawtransaction的参数: $ bitcoin-cli createrawtransaction '[{"txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0}]' '{"1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb": 0.025, "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL": 0.0245}'

10. 交易ID(txid)在交易确认之前并不权威。区块链中找不到交易哈希值并不意味着此笔交易没有进行。这被称作“交易延展性”,因为交易哈希值在区块确认之前是可以更改的。在确认之后txid是不变且权威的。

11. "blockindex" : 18,

值为18的区块索引(表明我们的交易为此区块的第18笔交易)。

12. 交易中包含一个空的条目scriptSig,因为我们并没有给它签名。如果没有签名,那么交易是没有意义的;同时我们也不能证明我们拥有未花费的输出的来源地址的所有权。通过签名,我们移除了输出上的障碍同时证明了我们的输出可靠。我们使用signrawtransaction 命令去签名交易。它需要原始十六进制的字符串作为参数。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G1ZMSZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券