講一下簽名
解鎖腳本里的簽名有三個(gè)作用:
身份認(rèn)證:花的錢是我的
交易認(rèn)證:這筆交易我是承認(rèn)的
內(nèi)容校驗(yàn):交易內(nèi)容不得更改
一個(gè)關(guān)鍵字段:Hash Type
它決定了交易的哪些部分被簽名休傍,未被簽名的地方則支持修改
基本hash Type有三種:
SIGHASH_ALL锹淌,SIGHASH_SINGLE板辽,SIGHASH_NONE
后綴ALL砰诵,SINGLE哥放,NONE對(duì)應(yīng)的是該簽名要包含的交易輸出個(gè)數(shù)各墨,也就是說(shuō)他們影響的是交易輸出
SIGHASH_ALL
計(jì)算步驟:
1. 用輸入對(duì)應(yīng)的輸出腳本(要去除OP_CODESEP ARATOR操作碼)替換要簽名的解鎖腳本缕棵,注意長(zhǎng)度也要重新計(jì)算识椰。
2. 其他輸入的解鎖腳本清空
3. 對(duì)灰色部分做sha256^2
SIGHASH_SINGLE
步驟:
1. 同上
2. 將剩余輸入的sequence設(shè)為0
3. 將#vout設(shè)為當(dāng)前簽名輸入的n+1
4. 當(dāng)前輸出之前的vout清空(其中nValue 置為-1入愧,其余字符置為nil)
注意的是這種簽名類型只簽名了與輸入對(duì)應(yīng)的輸出鄙漏。
什么叫對(duì)應(yīng)?就是vin0的簽名簽的是vout0棺蛛,vin1-->vout1
SIGHASH_NONE
步驟看圖怔蚌,就是一個(gè)輸出都不簽
SIGHASH_ANYONECANPAY
這是個(gè)修飾符,必須和上面三種類型共同使用旁赊,影響了交易輸入桦踊,該修飾符表示簽名時(shí)只簽正在被簽名的輸入本身,其他輸入不在簽名范圍內(nèi)彤恶,anyone can pay钞钙,who cares
步驟:
1. 基于上面各類型的步驟
2. #vin置為1
3. 移除該簽名輸入外的其他輸入
最后說(shuō)下根據(jù)hash值怎么算簽名
步驟:把hashtype接到交易后面后算hash256^2值,然后算個(gè)簽名声离,把簽名der編碼芒炼,然后把hashtype的最后一字節(jié)接到簽名后,ok
把簽名類型也保護(hù)起來(lái)了
還有一個(gè)fork id簽名术徊,后續(xù)補(bǔ)充進(jìn)來(lái)
下一節(jié)我說(shuō)下為什么有這么多簽名本刽,怎么玩