Contract-Design

為什麼智能合約語言需要確定性?

  • February 7, 2019

我在某處讀到智能合約語言需要是確定性的。為什麼?

正如 Richard 在第一條評論中所提醒的那樣,智能合約必須是確定性的,因為網路的每個節點都必須能夠在給定合約方法的相同輸入的情況下找到相同的結果。否則,每個執行合約方法來驗證交易的節點都會以不同的結果結束,並且不可能達成共識。

但是為什麼像 Solidity 這樣的智能合約語言本身必須是確定性的呢?它不一定是。

Solidity 是確定性的,因為它是一種為其目的精心設計的便捷語言,但例如 Lisk 網路使用的是非確定性的標準 JavaScript。這意味著沒有什麼可以避免使用一種方法在 Lisk 智能合約中生成隨機值。因此,開發人員必須非常小心避免使用非確定性函式。有時這可能很棘手。Math.random() 函式是顯而易見的,但其他一些數學方法可以使用舍入,這些舍入並不總是給出相同的結果,或者某些日期函式與給出目前日期的 new Date() 相同,因此是不確定的。正如您在Lisk 文件中所讀到的,警告開發人員不要使用此功能。但是,如果您不小心,您可能會完全破壞您的契約。

Solidity 和其他確定性語言的強大之處在於,開發人員甚至不必關心確定性,因為語言中沒有非確定性函式。

引用自:https://ethereum.stackexchange.com/questions/3557