2013年12月25日 星期三

比特幣手工簽署交易教學

教學原始資料在https://people.xiph.org/~greg/signdemo.txt,我稍微中譯整理一下,讓整個流程容易理解

需先安裝好兩個錢包,一個在沒有任何網路連線的電腦上,另一個則連上網路, 離線錢包先產生地址(公鑰),然後連線錢包送50BTC到離線地址,接著將50BTC 再送回連線錢包,可利用連線錢包套用上次的交易資料建構新交易,新交易由離線錢包簽署後, 用連線錢包公佈到網路上

1.首先,取得離線錢包一個新地址

[離線錢包]$ bitcoind getnewaddress
回傳值為
<離線錢包地址>


2.然後送50BTC給這個離線地址

[連線錢包]$ bitcoind sendtoaddress <離線錢包地址> 50
回傳值為
<txid_連線錢包付給離線錢包>

3.取得交易原生資料,離線錢包付錢時,將會用到裡面的txid及scriptpubkey

[連線錢包]$ bitcoind getrawtransaction <txid_連線錢包付給離線錢包> 1
回傳值為
{
"hex" : "<tx_hex_連線錢包付給離線錢包>",
"txid" : "<txid_連線錢包付給離線錢包>",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "69d02fc05c4e0ddc87e796eee42693c244a3112fffe1f762c3fb61ffcb304634",
"vout" : 0,
"scriptSig" : {
"asm" :
"3046022100ef89701f460e8660c80808a162bbf2d676f40a331a243592c36d6bd1f81d6bdf022100d29c072f1b18e59caba6e1f0b8cadeb373fd33a25feded746832ec179880c23901",
"hex" :
"493046022100ef89701f460e8660c80808a162bbf2d676f40a331a243592c36d6bd1f81d6bdf022100d29c072f1b18e59caba6e1f0b8cadeb373fd33a25feded746832ec179880c23901"
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 50.00000000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 dd40dedd8f7e37466624c4dacc6362d8e7be23dd OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "<hex_scriptPubKey_連線錢包付給離線錢包>",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"<離線錢包地址>"
]
}
}
]
}

4.取得連線錢包新地址

[連線錢包]$ bitcoind getnewaddress
回傳值為
<連線錢包地址>

5.以前個交易當草稿建立新交易,新交易會將50BTC送給連線錢包,執行後得到十六進制字串的回傳值

[連線錢包]$ bitcoind createrawtransaction '[{"txid":"<txid_連線錢包付給離線錢包>","vout":0}]' '{"<連線錢包地址>":50}'
回傳值為
<tx_hex_離線錢包付給連線錢包>

6.解碼十六進制字串,檢查內容是否符合預期

[離線錢包]$ bitcoind decoderawtransaction <tx_hex_離線錢包付給連線錢包>
回傳值為
{
"txid" : "d9f33ed2740eef77e40e72b692c4cf1feb6ab10d8adaaf27eb394fa5064b1160",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "<txid_連線錢包付給離線錢包>",
"vout" : 0,
"scriptSig" : {
"asm" : "還沒填",
"hex" : "還沒填"
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 50.00000000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 3744841e13b90b4aca16fe793a7f88da3a23cc71 OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a9143744841e13b90b4aca16fe793a7f88da3a23cc7188ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"<連線錢包地址>"
]
}
}
]
}

7.準備簽署交易,需提供scriptpubkey,讓離線錢包知道用哪隻鑰匙簽章

[離線錢包]$ bitcoind signrawtransaction <tx_hex_離線錢包付給連線錢包> '[{"txid":"<txid_連線錢包付給離線錢包>","vout":0,"scriptPubKey":"<hex_scriptPubKey_連線錢包付給離線錢包>"}]'

回傳值為
{
"hex" : "<tx_hex_離線錢包付給連線錢包_已簽名>",
"complete" : true
}

8.公佈交易到網路上

[連線錢包]$ bitcoind sendrawtransaction <tx_hex_離線錢包付給連線錢包_已簽名>
回傳值為
<txid_離線錢包付給連線錢包>

9.看看連線錢包有沒收到錢
[連線錢包]$ bitcoind listtransactions "" 1
回傳值為
[
{
"account" : "",
"address" : "<連線錢包地址>",
"category" : "receive",
"amount" : 50.00000000,
"confirmations" : 0,
"txid" : "<txid_離線錢包付給連線錢包>",
"time" : 1344221517
}
]

沒有留言:

張貼留言