Script
比特幣腳本有必要嗎?
satoshi 創建了比特幣腳本,這是比特幣客戶端用來處理大多數操作(例如發送或驗證交易)的語言。
這些操作是否需要另一種語言?難道不能用一種語言編寫整個執行時嗎?
這些操作是否需要另一種語言?難道不能用一種語言編寫整個執行時嗎?
需要明確的是:腳本語言的目標不是定義區塊鏈驗證的執行時邏輯。比特幣核心本身沒有任何部分是用比特幣腳本語言編寫的,只是用 C++ 編寫的。比特幣腳本語言的目標是自定義可以使用交易輸出的條件。這些腳本旨在由系統的“使用者”編寫,而不是由系統本身(作者)編寫。當然,在實踐中,它們是由這些使用者使用的錢包軟體的作者編寫和設計的,但它提供了原本不存在的靈活性:錢包作者可以開發和試驗該語言允許的新腳本,而無需等待整個比特幣生態系統採用更改來專門啟用他們的案例。
有沒有可能沒有這樣的語言:當然。有幾種加密貨幣根本沒有這樣的概念。但是這種替代方案並不一定意味著腳本語言被 C++(或任何其他編寫驗證邏輯的語言)取代 - 它可以簡單地意味著根本沒有可定制的支出條件,並且每個輸出都只是例如一個公鑰,每個輸入都只是一個簽名,沒有其他可能。
擁有這種語言只是引入了通過其他方式無法實現的功能。最簡單的例子是,只有在多人簽署時才能使用硬幣(*),或者只有在一定時間後,或者在某些秘密被揭露後才能使用。這些共同構成了例如無需信任的託管(託管無法竊取代幣)或建立在諸如支付渠道之類的頂部的系統的基礎。
也許您的問題是:為什麼這種支出條件的可定制性沒有使用語言作為編寫驗證邏輯的語言來完成?有幾個原因:
- 至關重要的是,比特幣腳本(或您設想的任何替代方案)的評估結果僅取決於交易本身送出的數據,或者可能在它最終進入的區塊鏈中。其他任何事情都會引發分叉風險。例如,腳本可以(也許令人驚訝地)不以任何方式觀察目前時間。各種驗證器執行驗證的(本地)時間不同,因此在 Script 中包含目前時間可能會導致一些驗證器接受而其他驗證器拒絕的腳本,這僅僅是因為在不同的時間點執行驗證。比特幣腳本可以然而(間接地)觀察區塊鏈中區塊的時間戳,因為這個值保證對於所有驗證者都是相同的。對用於通用程式的現有語言施加如此嚴格的限制是很困難的,並且為它使用單獨的語言可以更容易地實施這一點。
- 大小事項。作為一個全球共識系統,容量是有限的。系統希望讓參與的最慢和連接最差的設備的頻寬和延遲限制設置了鏈中可以包含多少數據的界限。該大小的一個方面是用腳本語言(或任何替代語言)表達典型條件需要多少數據。正如我們設想的許多交易,其支出條件至少涉及某種形式的簽名檢查,因此表達這些條件應該非常便宜。在比特幣腳本中,“需要用公鑰 X 對目前交易進行簽名”的邏輯可以用 2 個字節 + 公鑰的大小來表示。使用通用語言實現這一點要困難得多。
- 計算成本及其可預測性很重要。由於送出到網路的交易中包含的腳本將由每個驗證器執行並重新執行(可能永遠),我們關心驗證對這些驗證器的計算成本,並且特別希望該成本的上限。這意味著需要有一些機制來在執行時間過長時停止執行,或者能夠提前確定需要多長時間。
- 並非所有與區塊鍊或交易互動的軟體都是用同一種語言編寫的。在比特幣中,目前使用最多的驗證軟體是Bitcoin Core,它是用C++編寫的,但它遠不是唯一的錢包軟體,這些其他的錢包都是用多種語言編寫的。將 C++ 用於腳本語言幾乎需要所有這些實現都具有 C++ 依賴項。鑑於 C++ 是一種編譯語言,它還需要訪問 C++ 編譯器才能執行從網路接收的塊和交易中的腳本。C++ 不是為這種即時程式碼更新而設計的,並且使用抽象來例如在虛擬機或解釋器中執行它會否定首先使用相同語言存在的任何優勢。
(*) 現代密碼學中有一些技術可以實際製作一個公鑰,該公鑰只有在多人合作使用時才能使用。