0

假设,我在 Solidity 中编写了一份合约,目前正在由多个节点运行。出于某种原因,我进行了更改 - 代码或配置或两者兼而有之。我怎么知道,所有运行这个合约的节点都在运行最新版本的代码?

相反,如果合约被放置在一个开放的存储库(例如 GitHub)中,我怎么知道代码没有被篡改?

如果大多数节点确实决定篡改代码并运行该版本怎么办?

4

3 回答 3

2

简短的回答

没有“最新”版本。基本上,您甚至无法对已部署的代码进行“更改”。如果您确实需要您的 DApp 可更新,请继续阅读。

解释

当您将 Solidity 源代码编译成 EVM 字节码,将其部署到区块链(通过花费一些 Ether),并等待交易被挖掘时,DApp 程序就固定了。在运行时,唯一可能改变 DApp 状态的方法是调用合约的公共函数。

解决方案

您可以利用上述事实使您的 DApp 可更新:

  1. 定义一个接口 ( ) 具有一些您希望它们可更新的Cat抽象函数 ( )meow
  2. 定义一个Shorthair实现接口 ( ) 的合约 ( contract Shorthair is Cat)
  3. 部署合约 ( Shorthair)
  4. 定义另一个合约 ( FunMaker)

    1. 定义一个address变量 ( address catAddress)
      • 这是存储“最新”实现的地址
    2. 在构造函数中,接受一个address参数
      • 将值分配给catAddress
    3. 当您要调用可更新函数 ( meow) 时,请执行以下操作:

      Cat cat = Cat(catAddress)
      cat.meow()
      
    4. 创建另一个接受address参数 ( setCatAddress) 的函数,以便您可以更新address变量 ( catAddress)的值

现在,您的智能合约 ( FunMaker) 是可更新的。当您想要进行更新时,只需编写另一个实现Cat( Shorthair2, Persian, 不管) 的合约并部署它。部署后,记录地址并调用它setCatAddressFunMaker覆盖catAddress.

注意事项

智能合约的精神是“定义做什么,做定义做什么”。信任是基于这样一个事实,即部署后什么都不能改变。但是,如果你这样实现你的 DApp,你基本上是在颠倒原则。

此外,被调用的合约(Shorthair)不能直接处理调用者( )中的余额和变量FunMaker。尽管通过仔细的设计和变通方法仍然可行,但最好首先评估是否值得这样做。

于 2017-05-17T05:29:19.947 回答
1

它的组织方式完全不同。

合约字节码(通常来自编译器),而不是源代码,是区块链的一部分。它对传统的分销渠道漠不关心。

合约的存在是链的共享历史的一部分,因为字节码是部署合约的特定交易的(一部分)。所述部署交易也是链的不可变历史的一部分。

节点没有太大的纬度。他们无法决定要运行的版本。他们要么运行实际代码,要么不再成为共识的一部分。

因此,基本上,您知道所有节点都在运行您部署的合约,几乎没有(如果有的话)例外。这是对链条的唯一正确解释。

希望能帮助到你。

于 2017-03-07T16:52:07.170 回答
0

如何知道特定地址的合约源代码?

基本上,没有简单的方法。

我能想象的最简单的方法是通过字节码比较:

  1. 通过此调用获取特定地址的字节码
  2. 从所有者那里获取源代码
    • 在大多数情况下,他们愿意为您提供源代码
    • 这是因为智能合约的精神是“定义做什么,做定义什么”
    • 信任来自这样一个事实,即用户确切地知道它是如何实现的——不多也不少
  3. 使用 Solidity 编译器编译它
  4. 对结果进行字符串比较
于 2017-05-17T05:44:49.353 回答