1. 程式人生 > >比特幣交易中礦工檢查交易單的細節

比特幣交易中礦工檢查交易單的細節

一筆交易包括輸入部分和輸出部分,假設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 \leftrightarrow 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在簽名的時候就是這麼做的)

這中間可能進行了一些簡化

關於礦工收入