我的区块链技术学习笔记(二十):比特币场景化实践(2) [复制链接]

577
 
8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈attachments-2018-01-LqO2WUwp5a70249bba18b. 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈作者: Ivan Kuznetsov  吴寿鹤等
8btm.com-新币圈 8btm.com-新币圈著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
8btm.com-新币圈 8btm.com-新币圈
8btm.com-新币圈 8btm.com-新币圈
首先要做的事情是将新交易放到内存池中(再次提醒,在将交易放到内存池之前,必要对其进行验证)。下个片段:

8btm.com-新币圈 8btm.com-新币圈if nodeAddress == knownNodes[0] { for _, node := range knownNodes { if node != nodeAddress && node != payload.AddFrom { sendInv(node, "tx", [][]byte{tx.ID}) } }}检查当前节点是否是中心节点。在我们的实现中,中心节点并不会挖矿。它只会将新的交易推送给网络中的其他节点。
8btm.com-新币圈 8btm.com-新币圈下一个很大的代码片段是矿工节点“专属”。让我们对它进行一下分解:
8btm.com-新币圈 8btm.com-新币圈if len(mempool) >= 2 && len(miningAddress) > 0 {miningAddress 只会在矿工节点上设置。如果当前节点(矿工)的内存池中有两笔或更多的交易,开始挖矿:
8btm.com-新币圈 8btm.com-新币圈for id := range mempool { tx := mempool[id] if bc.VerifyTransaction(&tx) { txs = append(txs, &tx) }}if len(txs) == 0 { fmt.Println("All transactions are invalid! Waiting for new ones...") return}首先,内存池中所有交易都是通过验证的。无效的交易会被忽略,如果没有有效交易,则挖矿中断。
8btm.com-新币圈 8btm.com-新币圈cbTx := NewCoinbaseTX(miningAddress, "")txs = append(txs, cbTx)newBlock := bc.MineBlock(txs)UTXOSet := UTXOSet{bc}UTXOSet.Reindex()fmt.Println("New block is mined!")验证后的交易被放到一个块里,同时还有附带奖励的 coinbase 交易。当块被挖出来以后,UTXO 集会被重新索引。
8btm.com-新币圈 8btm.com-新币圈TODO: 提醒,应该使用 UTXOSet.Update 而不是 UTXOSet.Reindex.
8btm.com-新币圈 8btm.com-新币圈for _, tx := range txs { txID := hex.EncodeToString(tx.ID) delete(mempool, txID)}for _, node := range knownNodes { if node != nodeAddress { sendInv(node, "block", [][]byte{newBlock.Hash}) }}if len(mempool) > 0 { goto MineTransactions}当一笔交易被挖出来以后,就会被从内存池中移除。当前节点所连接到的所有其他节点,接收带有新块哈希的 inv 消息。在处理完消息后,它们可以对块进行请求。
8btm.com-新币圈 8btm.com-新币圈结果
8btm.com-新币圈 8btm.com-新币圈让我们来回顾一下上面定义的场景。
8btm.com-新币圈 8btm.com-新币圈首先,在第一个终端窗口中将 NODE_ID 设置为 3000(export NODE_ID=3000)。为了让你知道什么节点执行什么操作,我会使用像 NODE 3000 或 NODE 3001 进行标识。
8btm.com-新币圈 8btm.com-新币圈NODE 3000
8btm.com-新币圈 8btm.com-新币圈创建一个钱包和一个新的区块链:
8btm.com-新币圈 8btm.com-新币圈 blockchain_go createblockchain -address CENTREAL_NODE(为了简洁起见,我会使用假地址。)
8btm.com-新币圈 8btm.com-新币圈然后,会生成一个仅包含创世块的区块链。我们需要保存块,并在其他节点使用。创世块承担了一条链标识符的角色(在 Bitcoin Core 中,创世块是硬编码的)
8btm.com-新币圈 8btm.com-新币圈$ cp blockchain_3000.db blockchain_genesis.dbNODE 3001
8btm.com-新币圈 8btm.com-新币圈接下来,打开一个新的终端窗口,将 node ID 设置为 3001。这会作为一个钱包节点。通过 blockchain_go createwallet 生成一些地址,我们把这些地址叫做 WALLET_1, WALLET_2, WALLET_3.
8btm.com-新币圈 8btm.com-新币圈NODE 3000
8btm.com-新币圈 8btm.com-新币圈向钱包地址发送一些币:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go send -from CENTREAL_NODE -to WALLET_1 -amount 10 -mine$ blockchain_go send -from CENTREAL_NODE -to WALLET_2 -amount 10 -mine-mine 标志指的是块会立刻被同一节点挖出来。我们必须要有这个标志,因为初始状态时,网络中没有矿工节点。
8btm.com-新币圈 8btm.com-新币圈启动节点:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go startnode这个节点会持续运行,直到本文定义的场景结束。
8btm.com-新币圈 8btm.com-新币圈NODE 3001
8btm.com-新币圈 8btm.com-新币圈启动上面保存创世块节点的区块链:
8btm.com-新币圈 8btm.com-新币圈$ cp blockchain_genesis.db blockchain_3001.db运行节点:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go startnode它会从中心节点下载所有区块。为了检查一切正常,暂停节点运行并检查余额:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go getbalance -address WALLET_1Balance of 'WALLET_1': 10$ blockchain_go getbalance -address WALLET_2Balance of 'WALLET_2': 10你还可以检查 CENTRAL_NODE 地址的余额,因为 node 3001 现在有它自己的区块链:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go getbalance -address CENTRAL_NODEBalance of 'CENTRAL_NODE': 10NODE 3002
8btm.com-新币圈 8btm.com-新币圈打开一个新的终端窗口,将它的 ID 设置为 3002,然后生成一个钱包。这会是一个矿工节点。初始化区块链:
8btm.com-新币圈 8btm.com-新币圈$ cp blockchain_genesis.db blockchain_3002.db启动节点:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go startnode -miner MINER_WALLETNODE 3001
8btm.com-新币圈 8btm.com-新币圈发送一些币:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go send -from WALLET_1 -to WALLET_3 -amount 1$ blockchain_go send -from WALLET_2 -to WALLET_4 -amount 1NODE 3002
8btm.com-新币圈 8btm.com-新币圈迅速切换到矿工节点,你会看到挖出了一个新块!同时,检查中心节点的输出。
8btm.com-新币圈 8btm.com-新币圈NODE 3001
8btm.com-新币圈 8btm.com-新币圈切换到钱包节点并启动:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go startnode它会下载最近挖出来的块!
8btm.com-新币圈 8btm.com-新币圈暂停节点并检查余额:
8btm.com-新币圈 8btm.com-新币圈$ blockchain_go getbalance -address WALLET_1Balance of 'WALLET_1': 9$ blockchain_go getbalance -address WALLET_2Balance of 'WALLET_2': 9$ blockchain_go getbalance -address WALLET_3Balance of 'WALLET_3': 1$ blockchain_go getbalance -address WALLET_4Balance of 'WALLET_4': 1$ blockchain_go getbalance -address MINER_WALLETBalance of 'MINER_WALLET': 10就是这么多了!
8btm.com-新币圈 8btm.com-新币圈上一篇:我的区块链技术学习笔记(二十):比特币场景化实践(1)
8btm.com-新币圈 8btm.com-新币圈下一篇:我的区块链技术学习笔记(二十一):后记
8btm.com-新币圈 8btm.com-新币圈
8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈attachments-2018-01-KR3OuPgA5a62135b82784.jpg 8btm.com-新币圈 8btm.com-新币圈 8btm.com-新币圈

本版积分规则

发表主题 回复
mailtopia,把去中心化做到极致!

(c) 2015-2018 8BTM Inc. M链、₥币 All Rights Reserved 智能硬件IoT产品:福州智垒电子科技有限公司

网站备案证书号: 闽ICP备18010811号  Ƀ猫商城 IoT&BlockChain:微物联(福州)网络科技有限公司 SiteMap