7 - 1
比特幣每一筆交易都是被一個「密碼拼圖腳本」鎖起來,更精準的說,比特幣是
「一系列的交易,每一筆交易都是發送方解開了某交易的密碼拼圖腳本,所以發送方可以使用這筆交易;
而每一筆交易要送到接受方時,都是用密碼拼圖腳本鎖起來送給接受方」,
而密碼拼圖腳本是用「比特幣腳本」寫的。
每一筆交易都會用比特幣腳本鎖起來,如果可以解鎖這個腳本,那麼就可以使用這筆交易。
因為腳本可以撰寫,所以就可以發展出很多種不同的腳本,適合不同場景,
例如:用於公司的多簽名交易、普通錢包對錢包的交易,這兩個是用不同的比特幣腳本
以下是幾個不同的 op code,用來使用在不同腳本:
OP_CHECKSIG:檢查公私鑰配對,用於 P2PKHOP_CHECKMULTISIG:多簽地址配對OP_CHECKLOCKTIMEVERIFY:時間配對OP_RETURN:無法使用的交易,通常是傳送資料用
讓我們看一下實際的腳本,首先創造一個交易,但不要 sendrawtransaction
$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[0] | .txid')
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[0] | .vout')
$ recipient=$(bitcoin-cli getrawchangeaddress)
$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 1.2985 }''')
$ signedtx=$(bitcoin-cli -named signrawtransaction hexstring=$rawtxhex | jq -r '.hex')
我們來檢視這個簽名過的交易
$ bitcoin-cli -named decoderawtransaction hexstring=$signedtx
{
"txid": "7b5f161ff9f9275c94dca38348c91056fe6829a2b768ed82ede4bcf7c7384a68",
"hash": "7b5f161ff9f9275c94dca38348c91056fe6829a2b768ed82ede4bcf7c7384a68",
"size": 192,
"vsize": 192,
"version": 2,
"locktime": 0,
"vin": [
{
"txid": "99d2b5717fed8875a1ed3b2827dd60ae3089f9caa7c7c23d47635f6f5b397c04",
"vout": 0,
"scriptSig": {
"asm": "3045022100c4ef5b531061a184404e84ab46beee94e51e8ae15ce98d2f3e10ae7774772ffd02203c546c399c4dc1d6eea692f73bb3fff490ea2e98fe300ac6a11840c7d52b6166[ALL] 0319cd3f2485e3d47552617b03c693b7f92916ac374644e22b07420c8812501cfb",
"hex": "483045022100c4ef5b531061a184404e84ab46beee94e51e8ae15ce98d2f3e10ae7774772ffd02203c546c399c4dc1d6eea692f73bb3fff490ea2e98fe300ac6a11840c7d52b616601210319cd3f2485e3d47552617b03c693b7f92916ac374644e22b07420c8812501cfb"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 1.29850000,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 371c20fb2e9899338ce5e99908e64fd30b789313 OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a914371c20fb2e9899338ce5e99908e64fd30b78931388ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"mkYMA2i2vzEXjoDn4GfvPoFr3MJ62uUtMx"
]
}
}
]
}
在 vin 裡面有個 scriptSig,這個是「解鎖腳本」(unlocking script),
也就是要用這個腳本來解鎖這個 UTXO,每個 UTXO 都有解鎖腳本
scriptPubKey 則是在 vout,這是「鎖定腳本」(locking script),這是把 output 鎖住,
讓接受方用他的 scriptSig 解鎖,那麼他就可以使用