天天看點

bitcoin 源碼解析 - 交易 Transaction(三) - Script

之前的章節已經比較粗略的解釋了在Transaction體系當中的整體運作原理。接下來的章節會對這個體系進行分解,比較較長的描述細節的構成。

本章将要詳細分析bitcoin交易中的交易腳本-script到底是什麼東西。

在前面的文章中提到,在bitcoin的體系中,一個交易是被釋出到比特币的整體系統中的,而能夠操控之前交易的的TxOut(被鎖住的coin),是需要能夠操控這個TxOut的人提供"鑰匙"來控制。就像前文描述的,coin在整個系統中是像流水一樣的在體系中進行流通,而coin在其中在分叉點的時候會有一個像 “鎖” 的東西把coin鎖在這個節點上。而根據這個鎖産生了一個新的交易,繼續流通被這個鎖所鎖住的coin,是需要提供一個"鑰匙"的。

是以這裡的比喻:“鎖”和“鑰匙”就是比特币交易中的交易腳本Script

其中

“鎖” 對應着 scriptPubKey

“鑰匙”對應着 scriptSig

但是單純的把Script了解為“鎖”和“鑰匙”實在是太淺薄了。隻能完成這點事情的并不能展現Script 的強大,也無法對後人創立“智能合約”有所啟發。

是以在我看來,比特币的Script實際上是:

scriptPubKey 是上一個交易(out)提出的一個 “問題”

scriptSig 是我想使用上一個交易中錢,那麼我就對你提出的這個問題提供我的“答案”

因為公私鑰的關系,是以如果scriptPubKey 提出的問題是公鑰相關的問題,那麼很明顯,隻有持有私鑰的人才能回答這個問題,是以就簡化為剛才的所說的“鎖”和“鑰匙”的關系。

而另一方面,如何确認提供的“答案”就是能回答“問題”的呢?這就說明Script是需要被執行驗證的,而且這個驗證的過程隻需要txin提供的scriptSig 和驗證者自己從自己的記錄中找到的txout的scriptPubKey ,而這個驗證者就是廣大的礦工們。

整個系統精妙的地方就在于,scriptPubKey是驗證者(礦工)各自獨立持有的東西,其安全性由自己所保證的,而想要完成交易的人隻需要提供scriptSig給廣大驗證者就行,不需要一些多餘的上下文(可以了解為上下文由驗證者自己持有,雖然大家都互不信任,但是對于最廣大的人來說,這個上下文都是相同的)。

另一個方面不太被大多數人所注意到的是:

實際上剛才的模型簡化為了“問題”和“答案”,但是這個“問題”可不是很容易提供的。

這個“問題”應該滿足2個方面的要求:

問題的答案必須是十分明确的,唯一的,不能是個模糊的要求(這點在代碼中就是“代碼就是法律”的展現吧(笑),或許這就是智能合約無法完成真正人們所向往的替代所有合同執行的原因,因為合同雖然簽訂了,但是其中的内容其實很多是有讨價劃價,鑽空子的空間的)

答案必須容易的被驗證而不需要其他上下文環境。(這點就是這個問題提出的困難的地方,也就是這個問題要麼正向很難,逆向很容易,要麼驗證需要提供其他的附加的上下文環境。)

而公私密鑰的模式其實是完美的符合了這2方面的要求的。

那麼有沒有其他的問題呢?那是當然有的,比如我提出了一個數學問題,這個問題的解是唯一的并且可以很容易的驗證我的回答對不對

bitcoin 源碼解析 - 交易 Transaction(三) - Script

那麼我就可以建立一筆交易,而這筆交易的txin就提供這個問題的答案,隻要我的這個tx優先被礦工打包進入區塊中,并成為最長鍊,那麼這個問題下的錢就歸我了。

這個場景就是符合正向很難,逆向容易的場景。

接下來就解釋 比特币系統中的 CScript 到底是怎麼運作的。

在比特币源碼當中,對于CScript 單獨列出了 script.c/script.h 來實作這塊體系(對比把tx,block等所有實作全部放在main.c/.h來說),可見得中本聰在一開始設計這套體系的時候就把這塊的内容看的相當的重要。事實上這套體系也确實很複雜,但是也是得益于這套體系,才能取得現在的地位,如果沒有這個設計,比特币的實用性會被大幅度減弱。