Mastering Bitcoin — CH5 Transactions

徐粲邦
Taipei Ethereum Meetup
25 min readMar 7, 2017

Outline

本篇是 Mastering Bitcoin 這本書的第五章心得,如果你沒有這本書的話可以去這邊,書跟心得都不會講的太深入,我的目標是希望不懂寫程式的都能看得懂 (順便幫自己做筆記),希望這目標不會太困難。

第二章我們提過整個區塊鏈的架構,其中的段落 Bitcoin Transaction 也對比特幣的交易 (transaction) 有初步的介紹,所以強烈建議第二章的那一段落要先看過這章才會比較進入狀況,而第二章的連結在這邊。

而另外強者我朋友之前也寫過一篇關於本章最後一節的內容 (Standard Transactions),而我之前也寫過 Gcoin transaction 的拆解,和 transaction 的簽章,基本上這篇內容會涵蓋以上所有東西,有些部分會更清楚我覺得,當然也有些部分我覺得不太重了就忽略掉,所以這篇心得又更長了,不知道有沒有比第四章還長,總之要有心理準備。

最後本章最常用到的字,比特幣交易 (transaction) 我都用英文來表達而不用中文。

  1. transaction 的生命週期長什麼樣子?基本上這節是先複習之前幾章所提過的。
  2. transaction 的結構主要分為 input 和 output 兩部份,然而這兩個東西之間存在著什麼關係?
  3. 在 transaction 裡面的 script 有分為 lock 和 unlock 兩種,他們分別代表什麼意思又有什麼功用?
  4. 比特幣的 transaction script 其實有五種標準型態,他們的差異是什麼。

Transaction Lifecycle

之前提過 transaction 就是整個比特幣網路最核心的一個部分,整條區塊鏈 (blockchain) 就是一堆區塊 (block) 相接在一起,然後每個區塊裡面就是一堆的 transaction 了,所以他可以說是整條區塊鏈最核心的部分。

而 transaction 的生命週期開始於他被創建出來,基本上 transaction 就跟支票一樣,我寫一張 Alice 送給 Bob 100 元的支票,和你寫一張 Alice 送給 Bob 100 元的支票在還沒簽名之前會長的一模一樣,所以任何人都可以做創建 transaction 這件事,因為剛創出來的 transaction 只會記載著發送方要給接受方多少比特幣而已。

而 transaction 創造出來之後,第二步驟就是簽名,跟支票一樣簽名需要發送方親自來執行,這個步驟別人就無法取代你了,例如 Alice 送給 Bob 100 比特幣的 transaction 就一定要是 Alice 親自簽名,否則會出錯。一旦完成簽名之後這個 transaction 就有所有需要的資訊了,準備發送到比特幣網路。

第三步驟就是把簽過名的 transaction 發送出去,之前我們也提過先送給哪個節點是無所謂的,當一個節點收到一個他沒看過的 transaction,他就會把他再度傳出去給其他與他連結的節點,最後擴散到整個網路,而比特幣的 transaction 裡面因為沒有含任何機密的資訊,所以相比於信用卡交易常常需要在有加密的網路裡面傳輸,比特幣的就沒有這個問題。

大家常常說比特幣有匿名性的好處,其實就是因為比特幣 transaction 的發送方和接收方都是地址 (address),所以你隨便抓一個比特幣網路上 transaction,你也不知道在真實世界到底是哪個人。

Transaction Structure

我們已經知道 transaction 由兩個部分組成,分別是 input 和 output,而 output 由一個叫做 locking script 的保護起來,擁有這個 output 的人就可以提供密鑰 (private key) 來產生 unlocking script 組成 input 把它花掉。完整的 transaction 範例拆解如下

這個範例是一個真的比特幣 transaction,不過這是沒簽過名的 raw transaction,讀者如果手邊也有比特幣 transaction 也可以自行拆解看看,基本上 transaction 的欄位有以下四個

  1. version,這邊表明這個 transaction 是遵照哪一個規則,其實一般來說就是 1
  2. inputs,等等會再拆解他
  3. outputs,一樣等等會再拆解他
  4. locktime,這個數字是表示這個 transaction 最早可以多早進到 blockchain,如果是 0 的話代表希望立刻執行不想要有拖延,如果是介於 0 到 5 億,這個值就代表著區塊高度,區塊鏈沒有到這個區塊高度就不要把這個 transaction 收進去,最後如果是大於 5 億的值就代表是一個 Unix Epoch timestamp,沒到這個時間就不要把這個 transaction 收進去

Output

基本上 transaction output 就是一個一個不可分割可以讓所屬使用者花費的比特幣集合,還記得第二章舉的例子嗎?好比我手上有一張 100 元鈔票和兩枚 50 元硬幣,這三個東西就是我擁有還沒被花掉的 output,也就是 UTXO (unspent transaction output),我如果要買 30 元的東西就一定要用一個 50 元硬幣去付錢然後找錢 20 元 (這邊先不考慮手續費),當然你也可以用那張 100 元鈔票去付。

然而並不是所有的 output 都可以花費,有一種可能的 output 是不能被花掉的,他叫做 Data Output,本文最後一節才會提到他。除此之外,可以被花費的 UTXO 基本上都會由兩個部分所組成

  1. amount,這個 output 有多少比特幣的意思,但單位是 satoshi,比特幣價值的最小單位
  2. locking script,它定義這個 output 要可以被花費所需要滿足的條件,就是一個鎖來保護這個 output 不會被其他人花費

回到上面比特幣的範例 transaction 拆解來看,output 一開始會有 1 byte 的大小告訴我們總共有幾個 output,這邊範例是 2 個,接下來 amount 的部分因為這邊是 little endian,00e40b5402000000 轉成 big endian 的話就是 10000000000 satoshi,也就是 100 比特幣的意思。最後是 locking script,至於為什麼他會長這樣第三節會介紹。

>>> from struct import unpack
>>> from binascii import unhexlify
>>> unpack('<q', unhexlify('00e40b5402000000'))
(10000000000,)

順帶一提,在比特幣裡沒有記錄一個 address 的餘額,所以要算餘額其實就是把他手上擁有的 UTXO 相加,UTXO 雖然都記錄在區塊鏈上了,但每一次如果要算餘額都要完整掃一遍區塊鏈,實在有點太過麻煩了,因此其實每個節點都會維持一個 UTXO 的資料庫放在記憶體裡,就大幅減少的算餘額的時間了。

所有的 UTXO 都放在記憶體裡面感覺很恐怖,事實上這個資料庫現在的確有幾千萬個 UTXO 在裡面,但其實也才佔不到 2G 的記憶體空間而已,這個連結可以看現在 UTXO 的總大小。

Input

我們知道 input 基本上一定會對應到一個 output,所以 input 的資訊一定要指名是哪一個 transaction 的第幾號 output,再來因為你要花費那個指定的 output,所以也要提供一個 unlocking script 去解鎖 output 的 locking script。

回到上面比特幣的範例 transaction 的話,一樣會先有 1 byte 的大小告訴我們有多少個 input 在這個 transaction,可能不只一個 input 的原因例如我手上有很多小額的 UTXO 要湊起來買一個貴的東西。接下來就是告訴我們要去 transaction id 是多少的第幾個 output 找這個 UTXO,最後就是 unlocking script,他的樣子也是下一節才會提到。

到這邊 transaction 的 input 和 output 都簡介完了,書裡面提到了一個有趣的問題,那倒底是 input 先出現還是 output 先出現?感覺很像雞生蛋蛋生雞,答案是 output,因為當你一直往前追朔會找到一個只有 output 但沒有 input 的 transaction,他叫做 coinbase transaction,他是一個 block 裡面的第一個 transaction,其實也就是我們之前提到的挖礦獎勵 (mining reward)。這個 transaction 不需要有任何 input,而 output 就是把挖礦獎勵送給礦工 (miner) 的 address。

Fee

一個 transaction 的基本架構除了 input 和 output 以及一些其他的小欄位之外,其實還隱藏著一個我們之前也學過的東西,手續費 (transaction fee),我們知道手續費是 output 的值加起來去減掉 input 的值加起來,所以如果你嘗試自己創建 transaction 的話,一定要記得找錢的 output,要不然就等於送了大量的小費給礦工了。

手續費對礦工來說是一個誘因,因為礦工可以除了拿到獎賞之外還會拿到這個新區塊裡面的所有手續費,所以手續費夠多某種程度就保證這筆 transaction 會被收錄在下一個區塊裡,同時他對系統也有保護的作用,因為每創一筆 transaction 都需要付手續費,所以可以防止濫發 transaction 的狀況發生。

最後手續費大概要付多少?在比特幣裡面手續費的多寡會正比於 transaction 的大小,所以如果你的 input 或 output 越多所要付的手續費就會越高,這感覺起來像是一個「ok,我知道了,沒事了吧?」的感覺,但其實這件事情對其他機制有造成影響,最後一節就會知道了。

Transaction Chaining and Orphan Transactions

如果 transaction 的 input 所指定的 UTXO 還沒上區塊鏈跟當前的 transaction 一起在池子裡等待被收納進入新區塊呢?其實還是可行的,當礦工驗證過這筆 transaction 是合法的,但發現找不到它所指定的 UTXO 時,礦工會把他丟進一個暫時的池子,這個池子裡面就是專門裝孤兒的 (orphan transaction,因為他們找不到 parent transaction,parent 可能只比他們早一點點出生且還沒傳送到當前這個礦工),等到孤兒所指定的 UTXO 也傳到之後,礦工會再把它取出來一起把他們放進去他在創建的新區塊裡面。

不過這個池子會保持在記憶體裡面,為了避免系統遭受到 DoS (Denial of Service) 攻擊,池子的大小會設定一個上限,孤兒過多時就會有人被丟棄,而 DoS 中文叫做阻斷服務攻擊,在這邊就是一直有人濫發互相依賴的 transaction 導致池子越來越大,吃光記憶體的資源。順帶一提,新聞常看到的 DDoS 就是這個詞前面再加上分散式 (Distributed-)。

Summary

看到這邊代表第二節結束了,在結束之前我刻意地要做一個小結,這邊以上的東西其實大多都是複習。一個 transaction 從創建開始,經過簽名,然後傳送到網路上的任一個節點,節點會「驗證」其合法性,然後才會把它傳給其他節點最終擴散到全網路。然後 transaction 的架構主要有兩部份,input 和 output,output 有 locking script 去鎖著 UTXO 不被花費,想要花費的人就需要創建一個 input,用裡面的 locking script 去解鎖這個 unlocking script。

所以下一節就會講到什麼是 script,而我上一段說節點會去驗證 transaction 是否合法,其實也是驗證 input 的 unlocking script 能不能匹配他要花費的 UTXO 的 locking script,而 locking / unlocking script 的組合也不只一種,因此本篇的後兩節將會著重在他們兩個身上。

Transaction Script and Script Language

每個比特幣節點在驗證 transaction 是否合法時,就是驗證這筆 transaction 每個 input 的 unlocking script 是否有滿足對應的 UTXO 的 locking script,簡單來說,驗證就是把 locking script 和 unlocking script 接在一起,然後去執行他看看結果是不是正確的,而怎麼執行就是這節的重點。

Script Language

Script 是一種語言,書上是說他是一個非常輕量級在 1960 年代在用的語言,比特幣的 script 是又叫做 stack-based language,顧名思義因為他用了 stack 這個資料結構來當作引擎。

不知道什麼是 stack 嗎?你可以把它想成你放在箱子裡的書,因為箱子剛好塞滿所以你要拿某一本特定的書時,一定要先把最上面的書先依找順序拿出來,這個動作叫 pop,就是把最上面的東西拿出來,反過來說如果你要放書進去也一定是直接放在最上面,這個動作就叫做 push,push 和 pop 就是 stack 的兩個主要動作了。(為什麼人有很多衣服但都幾乎穿固定那幾件?因為為了求方便大家都 pop 最上面的衣服出來穿,洗完衣服之後又 push 回去衣櫃,所以塞在下面的衣服買了幾乎都不見天日 → 舉例而已如有雷同不用太過認真)

比特幣的 script 基本上就是從左到右依序執行,搭配一些比特幣定義好的運算子 (operator),完整的運算子可以看這個連結, 舉例來說 OP_ADD 這個運算子就會把 stack 上最上面的兩個東西 pop 出來做加法,然後在 push 回去 stack 的最頂端,而 OP_EQUAL 一樣是 pop 兩次然後去比對是不是一樣,如果一樣就 push TRUE (其實就是 1),不一樣就 push FALSE (就是 0) 回去 stack。例如以下範例

2 3 OP_ADD 5 OP_EQUAL

stack 最後會剩什麼?答案是只剩一個東西,TRUE,不知道的話可以看下面這張圖。

如果是這個範例呢?

2 3 OP_ADD 2 OP_MUL 1 OP_ADD 11 OP_EQUAL
  1. 一開始看到數字 2,就直接 push 進去 stack,再來看到數字 3 也一樣 push 進去,但他會在 2 的上面。
  2. 再來看到 OP_ADD,就把 3 和 2 依序 pop 出來做相加變成 5,再把 5 push 回到 stack,現在 stack 剩下 5。
  3. 又看到數字 2 了,二話不說 push 到 5 的上面。
  4. 看到 OP_MUL,這是乘法,於是把 2和 5 依序 pop 出來做相乘,變成 10 之後 push 回去,stack 剩下 10 而已。
  5. 在看到 1,直接 push。
  6. 又是相加,和步驟 2 的做法一樣,現在 stack 剩下 11 而已。
  7. 看到 11 也 push 進去。
  8. 最後看到 OP_EQUAL,把步驟 7 和 6 加入的 11 分別 pop 出來比對看看,數值是一樣的所以回傳一個 TRUE,所以最後 stack 就剩下一個 TRUE 在裡面。

到這邊我們已經瞭解了比特幣的 script 是怎麼運作的,回過頭來看 transaction script 都是怎麼組成的,是由 unlocking script 串接上 locking script 之後才去跑剛剛的流程,例如我們現在的 locking script 是以下

3 OP_ADD 5 OP_EQUAL

可以知道要能夠解開這個的 unlocking script 就一定要是以下

2

這樣他們接在一起就會變成

2 3 OP_ADD 5 OP_EQUAL

我們剛剛已經知道這個 script 最後會剩下一個 TRUE 留在 stack 裡面,這樣就代表這個 transaction 是合法的,不過真正的 transaction script 組合一定不會是像這樣,因為這樣代表任何一個人只要知道 2+3=5 這個數學式都可以花費這個 locking script 所保護的 UTXO,不過這邊可以了解到一個現象就是,任何驗證的節點都不需要知道 script 裡面長什麼樣子,他只要去把一次 script 的流程看看最後是不是 TRUE 就可以知道是否為合法的 transaction 了,所以這也是為什麼比特幣的 transaction script 能不只一種。

雖然比特幣的 script 有很多種運算子,但其實他是 Turing incompleteness,簡單來說他不能有迴圈或一些很複雜的流程,這樣是故意的為了確保 script 能在有限的時間內做完驗證,也是一種系統的保護機制。

Standard Transactions

進入到最後一節了,前面我們學過 transaction 是比特幣最核心的元件,其中他的兩塊組成分別是 input 和 output,output 有 locking script 保護著,而 input 需要提供 unlocking script 去解鎖他,上一節我們也介紹了這兩個 script 會跑在 stack 上來驗證是不是有成功的,這一節就會講那現今的比特幣 script 到底有哪些,而標準型態的 transaction 目前被歸類成五種,底下會一一介紹。

Pay to Public Key Hash (P2PKH)

絕大多數的比特幣 transaction 都是採用這個 script,就像是 Alice 的 address 送錢給 Bob 的 address 這種 transaction。P2PKH 的 locking script 會長的像這樣

OP_DUP OP_HASH160 <Public Key Hash> OP_EQUAL OP_CHECKSIG

上面的 Public Key Hash 其實就等同於擁有者的 address,只是是還沒有做 Base58Check encoding 的版本,這也是為什麼他叫做 P2PKH,因為他是付錢給 Public Key Hash,說穿了就是付錢給一般的 address。而如果需要花費這個 UTXO,input 的 unlocking script 就要長的像

<Signature> <Public Key>

上面的 Public Key 就是你的公鑰,注意這不是私鑰 (private key),私鑰一定不應該出現在公開的地方,例如 transaction 裡面,但公鑰就沒關係因為我們知道他無法推回去私鑰,另一個東西是 Signature,還記得私鑰和公鑰的關係嗎?

K = k * G

私鑰在橢圓曲線上乘上一個常數之後會得到公鑰,而這個 Signature 也是透過類似的步驟,只是有一點不同,簡單來說如下,先產生一個隨機變數 k,然後用他在橢圓曲線上產生一點,有點像私鑰產生公鑰的過程,如下式

(x1, y1) = k * Gr = x1
s = (z + r*d) / k
Signature = (r, s)

上式座標 (r, s) 就是 Signature,其中 z 是由 message 做 hash 出來的,在這邊 message 就是 raw transaction hash,最後 d 為私鑰。Signature 的 x 座標的確跟產生公鑰的過程一樣,而 y 座標不用理會只需要知道他的產生需要有私鑰的參與。

所以我們把 P2PKH 的 unlocking script 和 locking script 接起來就會長以下這樣。

有時候會看到在比特幣的 transaction 裡,他裡面的 script 會叫 scriptPubKey 和 scriptSig,如上圖括號裡的,這是因為通常放在 UTXO 的 script 都包含公鑰,而放在 input 裡的通常都包含 Signature,在 P2PKH 的確是這樣但等等我們就會看到這樣其實有點誤導,所以在本書我們都還是統稱放在 output 的 script 叫 locking script,而放在 input 的叫 unlocking script。

好,接下來我們要開始驗證 P2PKH 的 script 了。

  • 一開始先依序把 Signature 和公鑰 push 上去 stack。
  • 再來看到 DUP,因此就把 stack 最頂端的東西,也就是公鑰,多複製一次。
  • 接下來是 HASH_160,於是就把 stack 最上面的公鑰 pop 出來,做一次 HASH160,再 push 回去 stack 上面。
  • 接下來遇到 Public Key Hash,當然是直接 push 上去 stack。
  • 再來就是比較是不是一樣了,在第四章我們知道公鑰做一次 HASH160 之後其實就是 Public Key Hash,所以到這邊我們知道 unlocking script 為什麼要附上公鑰的其中一個原因了,因為公鑰可以證明你要花費的 UTXO 真的是被你的 address 所擁有。然後 EQUALVERIFYEQUAL 有點不同,他如果比對兩個數值一樣他不會 push TRUE 回去 stack。
  • 現在 stack 只剩下兩個東西了,Signature 和公鑰,其實就剛好是我們的 unlocking script,所以最後一步 CHECKSIG 就要確認他們有沒有一致就好了,不過怎麼驗證這一步驟?

先看下面這個橢圓曲線座標

(x2, y2) = (z/s) * G + (r/s) * Q

其中 r 和 s 為 Signature 的兩座標,Q 為公鑰,(x2, y2) 為橢圓曲線上一點,最後只要算出來的 x2 等於 Signature 的 r,就可以證明這個 Signature 是合法的!步驟如下

(x2, y2) = (z/s) * G + (r/s) * Q
= (z/s) * G + (r/s) * d * G // 公鑰由私鑰產生
= ((z + r*d) / s) * G // 結合律
= k * G // Signature 的 y 座標算式
= (x1, y1)
x2 = x1 = r

上面的算式和 Signature 的產生都有簡化過,詳細步驟可以參考這個連結,不過這邊帶出一個值得注意的重點,產生 Signature 需要有私鑰的幫忙,因為私鑰有參與產生 Signature 的 y 座標,而驗證 Signature 是否正確卻只需要公鑰即可。如果給的公鑰不正確,就會得到一個不一樣的座標,最後去比對 x2 和 r 時就會不一樣了。當然事實上不論是產生 Signature 還是驗證過程都複雜許多,這一小段是我自己簡化的 (例如方便起見我都先拿掉 mod),如果有講讀錯誤先說聲抱歉也拜託和我說一下!

拉回來整理一下整個 P2PKH 的驗證在幹嘛,主要在做兩件事情

  1. 你要給出公鑰來證明,這個 UTXO 所屬的 address 是你的,因為公鑰可以產生唯一的 address (這邊其實是 Public Key Hash,但意思和 address 一樣拉)。
  2. 除了給公鑰還不夠安全,你還要再給一個 Signature 證明你手上握有密鑰,因為 Signature 的產生需要密鑰,但驗證卻只需要公鑰。

Pay to Public Key (P2PK)

看名字就知道第二種和剛剛的 P2PKH 應該有關聯,他其實很簡單就是簡化版的 P2PKH,他的 locking script 長的像下面這樣

<Public Key A> OP_CHECKSIG

而他對應的 unlocking script 長的像這樣

<Signature from Private Key A>

發現不一樣了嗎?他直接把公鑰放在 locking script 了,所以你的 unlocking script 不用再給公鑰了,給 Signature 來驗證就好了。

Data Output (OP_RETURN)

第三個標準型態的 transaction 叫做 Data Output,他就是我們上面所說不能花費的 output,它的用處是拿來紀錄的,因為區塊鏈有公開透明不可被竄改的好處,因此這種形態的 output 就產生了,純粹的資料紀錄不用於轉錢。而他的 script (嚴格要說的話是 locking script) 就長這樣

OP_RETURN <data>

他不能被解鎖所以不會有 unlocking script,又因為這種 output 不能被花費,所以他也不會算 UTXO,在記憶體裡的那個資料庫就也不會有這種 output。

Multi-signature

什麼是多簽?就是現在有一個 script 他是由 N 個公鑰所組成,而如果要解鎖他所保護的 UTXO 只要其中 M 個提供簽名即可。而 M 在比特幣裡目前有最大上限是 15 個公鑰,他的 locking script 長的像這樣

M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG

例如 2–3 multi-signature 就如下

2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG

然後要解鎖他的 unlocking script 就會是

OP_0 <Signature B> <Signature C>

最前面的 OP_0 書上說是一個 bug 所以一定要加,事實上你如果去拆解真的 transaction 也真的會有,很有趣。另外這邊的 Signature 不一定要給 B 和 C,也可以是 A B 或 A C 或全都給,不過順序是重要的例如不能是 C B。最後依然也是把 unlocking script 和 locking script 接在一起來驗證,不過 OP_CHECKMULTISIG 是怎麼運作的我就沒有去研究了。

Pay to Script Hash (P2SH)

從上面的多簽來延伸,如果現在是 2–5 的架構 locking script 會有多長,如果是 3–7 呢?locking script 太長會造成什麼負擔?我們知道 locking script 是用來保護 UTXO 不被盜用的,locking script 的增長會導致 UTXO 的肥大,而我們剛說過 UTXO 為了方便會存放在昂貴的記憶體裡面,因此如果 UTXO 越來越大比特幣節點對記憶體的消耗也會越來越兇猛,因此 P2SH 就登場了。

P2SH 的作法其實就是把很長的 locking script 做一次 hash 之後來代替他,來達到縮短 locking script 的目的。簡單來說差異如下圖

可以看到 P2SH 的 locking script 會短很多,而這邊有點不同的是,在驗證 transaction 時會有兩步驟

首先,redeem script 會先和 locking script 跑一次確認是一樣的。例如

<2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash> OP_EQUAL

再來第二步,執行 unlocking script,因為可以看到 unlocking script 自己就帶有 redeem script 了。例如

<Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG

上面這一步驟就和 multi-signature 是一樣的了。所以總結 P2SH 可以說是改良版的 multi-signature,但因為把龐大的 redeem script 從 locking script 移到 unlocking script 去,所以驗證時就需要多第一步的檢查。

另外一個 P2SH 很重要的特色是,因為 locking script 現在夾住的是一個經過 HASH160 的產物,這其實跟產生 address 的過程是一樣的,如果再把他做 Base58Check encoding,也可以得到一種 address,就是大家很常說的 multisig address,這種 address 固定 3 開頭,他跟一般的 address 可以做到的事一模一樣,別人可以送錢到這個 address,而這個 address 也可以轉錢出去,差別只在於這種 address 送錢的 transaction 簽名時需要 redeem script 和可能不只一個 Signature 的參與。

總結 P2SH 來說他有以下幾個優點

  1. 縮小 locking script,導致 UTXO 不會太大,就節省了寶貴的記憶體。
  2. 他可以變成一種 3 開頭的 address,送錢的人只需要想成送給一個特別的 address 就好。
  3. 他可以讓手續費的壓力轉移到送錢的人身上,還記得我們說過 transaction 越大手續費就要越高嗎,這邊會產生影響了,因為 P2SH 的關係,output 會縮小 input 會變大,所以我送錢給 P2SH 就不會造成我的 transaction 過大,要不然本來的作法送錢給 Multi-signature 會產生很肥的 output 我還要自己負擔那個手續費,是很不合理的。
  4. 雖然 input 和 output 都會在區塊鏈上,但因為 redeem script 被放到 input 了,所以也只有等到被花費時才會增加區塊鏈的大小,而不是現在就立即增加大小。

Conclusion

終於這章結束了,這章的前半段幾乎都是之前提過的複習,例如 transaction 從創建開始,到簽名,到播送到比特幣節點去驗證,最後發佈到全網路上等到被收入新區塊,其中我們一直在提的簽名,是一種對這個 transaction 的授權,說穿了簽名就是填入適當的 unlocking script,去滿足我要花費的 UTXO 的 locking script

而後半段介紹了 script 的運作原理,他是跑在一個 stack 上的由左向右執行的語言,而因為 script 的組成不同也造就了 5 種不同型態的 transaction。

最後如果有還是不懂的或是講不清楚的地方歡迎來找我討論~如果有講錯的也請見諒並歡迎大力的更正我 Orz

雖然文章都只是一些我的閱讀心得,但如果你覺得我寫的文章有幫助到你踏入比特幣的世界,也歡迎透過比特幣贊助我 :D 1FwXwuNBA25fuJNBQ1L2iXnx23VHQBch3m

Reference

  1. Mastering Bitcoin
  2. https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
  3. https://en.bitcoin.it/wiki/Script

--

--