【问题标题】:Are Ethereum contract function securable?以太坊合约功能是否安全?
【发布时间】:2016-04-15 13:31:48
【问题描述】:

我正在使用 testrpc 和 web3。

我使用下面的成语来确保只有以前定义的用户才能做某事:

function doSomethingProtected() {
        if ( msg.sender != authorizedUser )
                throw;

        flagSomething = true;
   }

在使用 web3 的实例化合约上调用函数时,如下所示:

myContract.doSomethingProtected( { from: "0x..." } );

成功了。起初我很高兴,但后来我意识到 web3 API 并没有要求我为私钥等提供任何密码。

任何人都可以简单了解某人的公钥/地址来调用这个函数吗?

在示例中使用这个成语让我相信以太坊合约的一个好处是它确保 msg.sender 得到加密保证。

【问题讨论】:

    标签: ethereum solidity truffle


    【解决方案1】:

    原因是您使用的是 testRPC,它不会锁定它的帐户,因此您不需要密码。

    如果您要使用 geth 执行此操作,则需要先解锁该帐户,然后再从该帐户发送。

    没有私钥,这个函数会报错,所以你使用那个授权方法是正确的。

    【讨论】:

      【解决方案2】:

      如果不查看更多代码,很难确定,但您似乎是在本地节点上调用合约,而不是发送交易。交易只能由具有帐户私钥的人签名,这意味着您可以依靠msg.sender 来准确,但在您的本地节点上执行的消息不会强制执行。但是,他们所做的任何更改都会回滚并且不会应用于状态,因此无论您的本地调用做什么都没关系。

      【讨论】:

      • 我在一个 testrpc 节点上运行它。也许这就是问题所在。
      【解决方案3】:

      一般来说,从 web3.js 调用函数有两种方法:使用事务或仅使用“调用”。只有在交易中,您才能真正修改区块链内容(始终可以读取)。交易总是需要有效的签名,因此需要访问私钥。

      没有要求您输入密码的原因可能是您已经解锁了该帐户。此外,授权用户以外的其他用户都可以调用该函数,只会丢弃所做的更改。

      【讨论】:

        【解决方案4】:

        我的猜测是您的帐户在调用该函数时已经解锁。我不记得您的帐户在 web3 中解锁后解锁的确切时间。不过我可能是错的。会将此添加为评论,但我现在不允许。

        【讨论】:

          猜你喜欢
          • 2019-04-07
          • 2016-02-28
          • 2022-11-01
          • 2018-03-15
          • 2016-10-05
          • 2018-05-20
          • 2021-02-24
          • 1970-01-01
          • 2019-07-27
          相关资源
          最近更新 更多