【问题标题】:Solidity contracts : Source controlSolidity 合约:源代码控制
【发布时间】:2017-03-06 07:59:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: version-control ethereum smartcontracts


    【解决方案1】:

    简答

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

    说明

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

    解决方案

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

    1. 定义一个接口 (Cat),其中包含一些您希望它们可更新的抽象函数 (meow)
    2. 定义实现接口 (contract Shorthair is Cat) 的合约 (Shorthair)
    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) 可以更新了。当你想进行更新时,只需编写另一个实现CatShorthair2Persian,等等)的合约并部署它。部署完成后,记录地址并用它在FunMaker上调用setCatAddress,覆盖catAddress的值。

    注意事项

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

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

    【讨论】:

      【解决方案2】:

      它的组织方式完全不同。

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

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

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

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

      希望对您有所帮助。

      【讨论】:

      • 知道了。为了争论,如果字节码执行引擎是恶意的怎么办?或者,网络中的大多数此类引擎都选择了恶意。
      • 您可能会遇到 51% 攻击,其中大多数节点决定不更改某个合约的交易处理。 ;-)
      • “决定不”?或者,您的意思是“决定”?
      • “以太坊安全吗?我不这么认为。我绝对不能保证网络不会受到 51% 的攻击(尽管我愿意相信硬分叉会最大限度地减少此类攻击造成的损害)攻击)。” medium.com/@Vlad_Zamfir/… 解决了吗? ;)
      • “决定”。您询问了源代码控制,我试图提供帮助。如果您发现答案有用,下一步是接受或投票。不鼓励在本网站上进行冗长的聊天。 “以太坊安全吗”这个话题太大了,无法在这里解决。
      【解决方案3】:

      如何知道具体地址的合约源代码?

      基本上没有简单的方法。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-05
        • 2012-07-25
        • 2018-08-13
        • 1970-01-01
        • 2022-08-05
        • 2022-07-17
        • 2020-10-20
        • 2010-09-12
        相关资源
        最近更新 更多