BCH 的 raw transaction 沒有想到會在這個題目上發了這麼多篇。幾經折騰,終於順利發上鏈的,來整理一下幾個關鍵拼圖。 首先,可能會問:什麼是 raw tx,可以生吃還是要煮熟淋上醬油再服用? 其實說穿了沒什麼,raw tx 就是比特幣區塊裡一個一個的交易紀錄;這裡用詞上要比較注意的是,一個 raw tx 不見得只有一個交易,為免混淆還是用 raw tx 來指稱。 Raw tx 裡最重要的部分就是輸入跟輸出。輸入指的是這個 raw tx 裡價值的來源,就是一個或多個有著各種價值的 UTXO。輸出的部分指的則是要怎麼對這些價值作分配。UTXO 指的是「未花用的輸出」,聽起來似乎有雞生蛋蛋生雞的問題,故實際上所有的 UTXO 都源自區塊出塊獎勵。 而一個 raw tx 裡,只要符合「輸入的總金額 > 輸出的總金額」這樣的條件,輸入跟輸出就隨便你塞。輸出與輸入間的差額則是會被礦工收走的交易手續費。所以輸入的部分可以塞自己的一筆或多筆 UTXO,也可以同時塞進去別人的一筆或多筆 UTXO。 別人的?對,只要你能夠拿到有效的簽名就可以。除了輸入金額要大於輸出金額以外,raw tx 裡需要包括的就是對 UTXO 支配權力的證明。每一次輸出,除了紀錄金額以外,也記錄著這個輸出的解鎖條件。比特幣不會人臉辨識,只要你能解鎖都會當你是有錢人。 (註:所以比特幣本身是可以容納相當的匿蹤性,但就我理解要透過一些池子來混,也就是說,如果池子被汙染被記錄的話,是有可能被解跡的;所以如果要從本地端送出就具有匿蹤性,就得需要一個不同的系統。這是我之後想了解的。) 所以比特幣的價值賦予過程就是:礦工挖出來→【上鎖→解鎖】(→ 不小心丟掉了),而這個上鎖、解鎖的過程可以不斷重複,而其中一個具體呈現就是我們一般理解的交易。這個具體呈現在比特幣稱作 P2PKH = pay to public key hash,付錢到一個公鑰雜湊值,解鎖條件就是去證明你有這個公鑰對應的私鑰。 (註:在這點上我在想不洩漏私鑰是不是必須的,還是只是一個安全性冗餘。如果我簽署了一個 UTXO 後不再有新的價值進到這個 P2PKH,私鑰其實就沒用了;也就是說如果恪遵不重複使用 P2PKH 的原則的話,直接送私鑰上鏈驗證應該也不是什麼問題。當然實務上可能會忘了跟別人說不要再用這個 P2PKH 了。@Ayukawayen: 直接送私鑰出去會有front running風險 https://noise.cash/post/ln9255xn ) 稱為上鎖解鎖在概念上是比較正確而不被拘束的。除了「擁有鑰匙的人可以打開」這樣相對簡單的解鎖合約條件以外,如果吃飽太閒,也是可以把條件設定為「吃飽太閒而且左手大拇指可以繞過右頸摸到左耳的人」都可以解鎖,即智能合約成為可能,管你是什麼吃飽太閒設計。合約條件的彈性當然有極限,受限於比特幣 Script OPCODE 系統的設計。總之,節點礦工收到 raw tx 後,會一筆一筆去驗證每一個 UTXO 是否都能夠被解鎖,作的事情就是把送上來的解鎖碼(unlocking script)跟既有的上鎖碼(locking script)排起來丟進機器裡,機器就會吐出真偽來判斷交易是否能成立。 所以 raw tx 就是一個或多個的「前次上鎖了輸出+解鎖碼+重新上鎖了的輸出」。一般提到區塊鏈指的是 Merkle 樹上較高層級的結構的連串過程。但在最底部的 UTXO 其實也是無限(當然並非真的無限)多條生生滅滅增增減減的鏈。那麼區塊鏈的存在理由應該也就能想到了?比特幣網路是一個分散式系統,那我是不是可以先在 X 節點上把同樣一個 UTXO 簽給 B的同時在另外一個 Y 節點上簽給 C、Z 節點上簽給 D?(三花攻擊聽起來比較金庸比較厲害484)如果這些交易都被核可了會造成帳本的混亂。所以這許許多多的底層 UTXO 鏈的推演,會依最長的那條區塊鏈來作數。 一般討論加密貨幣大多會聚焦在這個區塊鏈的共識機制上,有 Proof-of-Work、P-o-Stake、以至於 P-o-Person、P-o-Coverage 等等。但區塊鏈的(底層)實作應用上,更重要需要去了解的或許反而是,以比特幣來說,在【上鎖→解鎖】這個設計架構上,可以做什麼。就白皮書的標題訴求來說,BCH 大概綽綽有餘了。但我自己覺得還蠻有趣的地方是,中本聰比特幣的設計所能達到的,似乎不僅止於白皮書標題所描述的。 寫得冗長,不過這大概是我的理解與想自己做 raw tx 的初衷。野人獻曝,歡迎討論。 這篇本來是要寫實作的一些心得跟覺得值得注意的地方,不過好像太長了。之後再另起一篇了。 圖一節錄自前篇提到的碩士論文 https://noise.cash/post/lzxww059 提供了比較學術口吻的區塊鏈描述介紹? 另外附上一張照片,是印下來比對偵錯的多張 raw tx。看久了就有點看熟了,就覺得十六進位其實也是蠻 human readable 的... 想到駭客任務裡看位元串可以解碼的那位 XD 這邊該不會就有可以讀二進位的高手吧?
3 comments
直接送私鑰出去會有front running風險,就是別人(可能是礦工)看到私鑰後把收款者改成自己再發一個交易把錢搶先轉走。所以要有辦法鎖定收款者才能這樣做。 鎖定收款者後可以玩Hashed Timelock Contracts https://en.bitcoinwiki.org/wiki/Hashed_Timelock_Contracts
的確! 所以要自己當礦工(X)
推專業整理 雖然看不懂XD