假设,我在 Solidity 中编写了一份合约,目前正在由多个节点运行。出于某种原因,我进行了更改 - 代码或配置或两者兼而有之。我怎么知道,所有运行这个合约的节点都在运行最新版本的代码?
相反,如果合约被放置在一个开放的存储库(例如 GitHub)中,我怎么知道代码没有被篡改?
如果大多数节点确实决定篡改代码并运行该版本怎么办?
假设,我在 Solidity 中编写了一份合约,目前正在由多个节点运行。出于某种原因,我进行了更改 - 代码或配置或两者兼而有之。我怎么知道,所有运行这个合约的节点都在运行最新版本的代码?
相反,如果合约被放置在一个开放的存储库(例如 GitHub)中,我怎么知道代码没有被篡改?
如果大多数节点确实决定篡改代码并运行该版本怎么办?
没有“最新”版本。基本上,您甚至无法对已部署的代码进行“更改”。如果您确实需要您的 DApp 可更新,请继续阅读。
当您将 Solidity 源代码编译成 EVM 字节码,将其部署到区块链(通过花费一些 Ether),并等待交易被挖掘时,DApp 程序就固定了。在运行时,唯一可能改变 DApp 状态的方法是调用合约的公共函数。
您可以利用上述事实使您的 DApp 可更新:
Cat
抽象函数 ( )meow
Shorthair
实现接口 ( ) 的合约 ( contract Shorthair is Cat
)Shorthair
)定义另一个合约 ( FunMaker
)
address
变量 ( address catAddress
)
address
参数
catAddress
当您要调用可更新函数 ( meow
) 时,请执行以下操作:
Cat cat = Cat(catAddress)
cat.meow()
创建另一个接受address
参数 ( setCatAddress
) 的函数,以便您可以更新address
变量 ( catAddress
)的值
现在,您的智能合约 ( FunMaker
) 是可更新的。当您想要进行更新时,只需编写另一个实现Cat
( Shorthair2
, Persian
, 不管) 的合约并部署它。部署后,记录地址并调用它setCatAddress
来FunMaker
覆盖catAddress
.
智能合约的精神是“定义做什么,做定义做什么”。信任是基于这样一个事实,即部署后什么都不能改变。但是,如果你这样实现你的 DApp,你基本上是在颠倒原则。
此外,被调用的合约(Shorthair
)不能直接处理调用者( )中的余额和变量FunMaker
。尽管通过仔细的设计和变通方法仍然可行,但最好首先评估是否值得这样做。
它的组织方式完全不同。
合约字节码(通常来自编译器),而不是源代码,是区块链的一部分。它对传统的分销渠道漠不关心。
合约的存在是链的共享历史的一部分,因为字节码是部署合约的特定交易的(一部分)。所述部署交易也是链的不可变历史的一部分。
节点没有太大的纬度。他们无法决定要运行的版本。他们要么运行实际代码,要么不再成为共识的一部分。
因此,基本上,您知道所有节点都在运行您部署的合约,几乎没有(如果有的话)例外。这是对链条的唯一正确解释。
希望能帮助到你。