比特幣交易中礦工檢查交易單的細節
一筆交易包括輸入部分和輸出部分,假設A向B發起一筆轉賬,那麼
in:A(pk,sig)
out:B(addr)
其中,someone.addr = HASH160(some.pk)
接下來,B要向C轉賬,那麼
in:B(pk,sig)
out:C(addr)
礦工要檢查以下兩點:
1. H160(B.pk) = B.addr ? (地址和公鑰是否相符)
2. B.pk B.sig ? (公鑰和簽名是否相符)
由以上兩點即可得出地址和簽名是否相符。
具體的檢查過程如下:
<PushData><B.sig><PushData><B.pk>
<OP_DUP><OP_HASH160><PushData><B.addr><OP_EQUALVERIFY><OP_CHECKSIG>
OP是對資料進行操作的指令,經過彙編會變成0x76這種形式,為了防止<B.sig> <B.pk> <B.addr>中含有此類數字而被誤認為是指令,故在其前面進行<PushData>這樣的標記,<PushData>是16進位制數,記錄了後面資料的長度,通過一些手段使得<PushData>不會與彙編出來的指令產生重複。
基於堆疊的驗證過程如下:
1. B.sig 入棧
2. B.pk 入棧
3. <OP_DUP>複製棧頂,即B.pk
4. 令a = B.pk, 再令 a = Hash160(a), B.pk出棧
5. B.addr 入棧,b = B.addr, B.addr 出棧
6. 比較a 和 b,即為B.pk 和 B.addr
7.用B.pk解開B.sig的內容,進行驗證,驗證出的內容應該是交易單2的in替換為交易單1的out,然後對替換後的交易單2的整個in和out做雜湊(也就是說,B在簽名的時候就是這麼做的)
這中間可能進行了一些簡化
關於礦工收入