從日志上看啟動了測試網(wǎng)絡(luò)預(yù)設(shè)的4個測試節(jié)點(diǎn):00,01,02,03啟動,其中01,02,03設(shè)置00為其boot node。這里bitcoin-test打出的日志是00節(jié)點(diǎn)的debug日志。
三、測試網(wǎng)絡(luò)手動區(qū)塊生成和轉(zhuǎn)賬以及客戶端應(yīng)用API調(diào)用
我們采用各種情景循序漸進(jìn)的方式加以介紹。
情形1: coinbase發(fā)行新幣
比特幣網(wǎng)絡(luò)通過挖礦節(jié)點(diǎn)的挖礦獎勵進(jìn)行比特幣的發(fā)行,起始時(shí)挖到一個區(qū)塊可以得到50BTC,但是挖礦節(jié)點(diǎn)挖出的新幣需要100個區(qū)塊確認(rèn)才可以被使用,我們將查看這一過程。
新起一個終端執(zhí)行區(qū)塊鏈網(wǎng)絡(luò)的控制(該終端代稱:testnet終端)
$ docker exec -itbitcoin-testnet bash
再起一個終端執(zhí)行客戶端的調(diào)用(該終端代稱:testnet-client終端)
$ docker exec -itbitcoin-testnet-client bash
我們先通過testnet-client終端查看目前00節(jié)點(diǎn)的BTC余額情況
$ node listunspent
我們通過testnet-client終端查看到00節(jié)點(diǎn)可用的BTC余額為0。第一次執(zhí)行l(wèi)istunspent腳本時(shí)會將為00節(jié)點(diǎn)預(yù)先準(zhǔn)備的錢包導(dǎo)入到00節(jié)點(diǎn)上,錢包導(dǎo)入時(shí)需要錢包WIP(Wallet ImportFormat)和對應(yīng)私鑰。
下面通過testnet終端在00節(jié)點(diǎn)上人工產(chǎn)生100個區(qū)塊。
# make generate0BLOCKS=100
從docker-compose啟動的終端上可以看到新的區(qū)塊被逐個加入到區(qū)塊鏈上。
再通過testnet-client終端查看00節(jié)點(diǎn)目前可用余額情況,還是0。
# nodelistunspent00
通過testnet終端,我們在00節(jié)點(diǎn)上再執(zhí)行一個區(qū)塊的生成。
# make generate0BLOCKS=1
再通過testnet-client終端查看00節(jié)點(diǎn),區(qū)塊鏈高度101,目前可用余額變成50,而其導(dǎo)入的錢包TestWallet-m00的余額依然為0。
# nodelistunspent00
情形2:執(zhí)行coinbase發(fā)行的新幣到錢包轉(zhuǎn)賬
我們從00節(jié)點(diǎn)往01節(jié)點(diǎn)所持有的TestWallet-m01轉(zhuǎn)入10BTC,然后通過人工產(chǎn)生區(qū)塊模擬6個區(qū)塊挖礦確認(rèn)。(區(qū)塊鏈網(wǎng)絡(luò)經(jīng)過6個區(qū)塊確認(rèn),可以保證區(qū)塊中的交易不可撤銷,也就可以認(rèn)定為可以花用的inputtransaction了。6個區(qū)塊確認(rèn)是在客戶端上調(diào)用listunspent api設(shè)定的參數(shù))
下面通過testnet終端在00節(jié)點(diǎn)往TestWallet-m01代表的錢包地址轉(zhuǎn)賬10BTC。
# make sendfrom0ADDRESS='mkq2mLXFX44YavfHDA2LT8pTYgbRPPdU15' AMOUNT=10
我們先通過testnet-client終端查看01節(jié)點(diǎn),第一次執(zhí)行l(wèi)istunspent腳本時(shí)會將為01節(jié)點(diǎn)預(yù)先準(zhǔn)備的錢包導(dǎo)入到01節(jié)點(diǎn)上。
# nodelistunspent01
通過testnet終端,我們還是通過00節(jié)點(diǎn)模擬挖5個區(qū)塊
# make generate0BLOCKS=5
再通過testnet-client終端查看01節(jié)點(diǎn),區(qū)塊鏈高度106,目前導(dǎo)入的錢包TestWallet-m01的余額為10,但是Unspent還是空的。
# nodelistunspent01
通過testnet終端,我們再讓00節(jié)點(diǎn)挖出一個區(qū)塊
# make generate0BLOCKS=1
再通過testnet-client終端查看01節(jié)點(diǎn),區(qū)塊鏈高度107,目前導(dǎo)入的錢包TestWallet-m01的余額為10,Unspent中也看到了金額為10BTC的可花交易。
# nodelistunspent01
情形3:執(zhí)行錢包到錢包的轉(zhuǎn)賬
我們從TestWallet-m01 (當(dāng)前可花10BTC)轉(zhuǎn)賬1BTC到TestWallet-m02。
先通過testnet-client終端查看02節(jié)點(diǎn)賬戶余額情況,第一次執(zhí)行l(wèi)istunspent腳本時(shí)會將為02節(jié)點(diǎn)預(yù)先準(zhǔn)備的錢包導(dǎo)入到02節(jié)點(diǎn)上。
# nodelistunspent02
通過testnet-client終端執(zhí)行錢包TestWallet-m01到錢包TestWallet-m02的轉(zhuǎn)賬
# node RpcTestnet01
由于TestWallet-m01當(dāng)前存在可花余額10BTC>轉(zhuǎn)賬金額1BTC,所以交易可以成功執(zhí)行。
通過testnet-client終端查看02節(jié)點(diǎn)賬戶余額為0。
# nodelistunspent02
通過testnet終端,我們這次在01節(jié)點(diǎn)上執(zhí)行5個區(qū)塊確認(rèn)
# make generate1BLOCKS=5
通過testnet-client終端查看02節(jié)點(diǎn)錢包TestWallet-m02余額為1,但可花依然為空。
# node listunspent02
通過testnet終端,在01節(jié)點(diǎn)上執(zhí)行1個區(qū)塊確認(rèn)
# make generate1BLOCKS=1
再通過testnet-client終端查看02節(jié)點(diǎn)錢包TestWallet-m02余額為1,經(jīng)過6個區(qū)塊確認(rèn),Unspent中也看到了金額為1BTC的可花交易。
# nodelistunspent02
情形4:運(yùn)用操作碼OP_RETURN(ox6a)標(biāo)記無效轉(zhuǎn)賬交易實(shí)現(xiàn)備注上區(qū)塊鏈刻字
通過testnet-client終端運(yùn)行OpreturnTestnet02
# nodeOpreturnTestnet02
由于存在unspent交易在TestWallet-m02(1BTC)上,這里只需花費(fèi)礦工費(fèi)用200000satoshi,找零還是打回TestWallet-m02。
通過testnet-client終端查看02節(jié)點(diǎn)錢包TestWallet-m02余額減少為0.998,由于找零還沒有得到確認(rèn),可花交易為空。
# nodelistunspent02
通過testnet終端,在01節(jié)點(diǎn)上執(zhí)行6個區(qū)塊確認(rèn)
# make generate1BLOCKS=6
在testnet-client終端再查看02節(jié)點(diǎn)錢包TestWallet-m02余額0.998BTC,可花交易0.998BTC。
# nodelistunspent02
這個過程可以反復(fù)執(zhí)行,直到unspent不足以支付礦工打包費(fèi)用。
# nodeOpreturnTestnet02
# make generate1BLOCKS=6
# nodelistunspent02