您现在的位置: 比特财富网 >> 区块链 >  >> 區塊鏈百科
智能合約的確定性
如果一個程序在不同的計算機、或者在同一台計算機上的不同時刻多次運行,對於相同的輸入能夠保證產生相同的輸出,則稱該程序的行為是確定性的,反之則稱該程序的行為是非確定性的。www.emoneybtc.com使程序產生非確定性的因素有很多,總結起來有以下幾種:
調用了非確定性的系統函數
一般在編寫程序的時候,開發者或多或少會調用一些系統提供的函數和功能以減少開發的工作量。這些系統函數中可能會存在一些非確定性的函數,比如生成隨機數、獲取系統時間等。一旦程序調用了另一個非確定性的程序並使用了它們輸出的內容,那麼該程序自身的行為也可能會變為非確定性的。
使用了非確定性的數據來源
如果一個程序在運行時獲取數據,而數據源提供的是非確定性的數據,那麼該程序也可能會變成非確定性的程序。例如,通過搜索引擎來獲取某個關鍵詞的前10條搜索結果——搜索引擎針對不同的IP地址來源可能會返回不同的排序結果。
動態調用
動態調用是指,一個程序在調用另一個程序時,如果必須在運行時才能確定被調用的目標,則稱該調用為動態調用;反之,如果在運行前即可確定被調用的目標,且在運行時無法變更該目標,則稱該調用為靜態調用。由於動態調用的目標在運行時決定,因此其行為是非確定的。
對於區塊鏈上的智能合約,我們一般要求它的行為必須是確定性的,因為非確定性的合約可能會破壞系統的一致性。區塊鏈的作者必須考慮到這個問題,並在設計智能合約系統的時候,就想辦法把非確定性因素排除在外。那麼我們來看看現有的各個區塊鏈是如何解決這個問題的。
比特幣
比特幣內置了一套腳本引擎,用於執行鑒權腳本,它是區塊鏈智能合約的雛形。開發者可以基於這套腳本系統來開發一些簡單的應用,但由於其指令集非常簡單且非圖靈完備,能夠實現功能相當有限。這套系統既沒有提供任何系統函數,也沒有提供任何訪問數據的能力,更沒有動態調用的功能,甚至連靜態調用也沒有提供,因此比特幣的智能合約一定是確定性的。
以太坊
以太坊的主要設計思想,就是提供一個圖靈完備的智能合約平台,讓用戶可以編寫任意邏輯的程序。它專門開發了一個用於執行合約代碼的虛擬機EVM,並設計了一種類似於JavaScript的高級語言Solidity,以方便用戶進行開發。以太坊智能合約沒有提供任何非確定性的系統函數,可訪問的數據也僅限於鏈內數據,外部數據需要通過交易來發送到合約。但是,以太坊的CALL和CALLCODE指令的目標地址通過棧來傳遞,使得合約可以在運行時動態調用其它的合約代碼,使合約的調用路徑變為非確定性。好在合約可以訪問到的數據都是確定性的,使得所有節點在動態調用目標代碼時一定會獲得相同的目標地址,保證了系統的一致性。但是調用路徑的非確定性,會導致一個可擴展性上的重要性能損失,具體會在《重構智能合約(中):平行宇宙與無限擴展》中詳述。
Fabric
Fabric是超級賬本中的一個子項目,它的智能合約采用了重量級的Docker作為執行環境。這可能跟大家的印象有點矛盾——“Docker不是一直被認為是一種輕量級的容器技術嗎?”。實際上,Docker的“輕”是相對於模擬物理機架構的重量級虛擬化技術而言。在區塊鏈應用場景下,Docker是一個比較“重”的執行環境,這也是Fabric的性能瓶頸所在,目前只能達到每秒幾百TPS。由於Docker的特性,智能合約幾乎可以使用物理計算機上的所有功能,因此具有極高的非確定性。所以Fabric要求智能合約的開發者在編寫代碼的時候盡量避免使用到具有非確定性的功能,並計劃提供一套專門開發的確定性系統函數庫供開發者使用。然而,由於無法從底層機制上避免非確定性的產生,寄托於開發者遵守良好的開發規范難免有些一廂情願。非確定性就像幽靈一般,平時似乎並不存在,在一些邊緣案例(corner case)上就可能會突然冒出來造成難以判斷的故障。
  • 黃金期權交易

    黃金期權交易概述   黃金期權合同是指規定按事先商定的價格、期限買賣數量標准化的黃金的權利。  黃金期權合同也同其他商品和金融工

  • 股票術語--cpi

        CPI是居民消費價格指數的英文縮寫,反映消費者支付商品和勞務的價格變化情況,也是一種度量通貨膨脹水平的工具。&n

  • 外匯交易之道在悟不在求

    外_匯_邦 WaiHuiBang.com 接觸外匯交易五年多了,暴倉一年半,休息一年半。2015差不多打平。

  • 美團眾包沒箱子能送嗎?

    最佳答案: 美團眾包沒箱子也是能接單送的。選擇做美團眾包,平台對眾包騎手是不強制購買裝備的,對於新手

  • 雙十一花呗臨時額度怎麼玩?

    最佳答案: 進入花呗頁面後,看到“喜歡你就提額”的頁面活動,點擊進入可以試試手氣。最多10次機會,一

  風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
比特財富網 版權所有 © www.emoneybtc.com