以太坊合约功能是否安全?

Are Ethereum contract function securable?

我正在使用 testrpc 和 web3。

我使用下面的习惯用法来确保只有先前定义的用户才能执行某些操作:

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

        flagSomething = true;
   }

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

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

它起作用了。起初我很高兴,但后来我意识到 web3 API 没有要求我提供任何私钥或类似的密码。

谁能简单了解某人 public key/address 调用此函数?

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

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

我的猜测是您的帐户在调用该函数时已经解锁。我不记得你的账号在 web3 中解锁后具体是什么时候解锁的。不过我可能是错的。本来可以将其添加为评论,但现在不允许我这样做。

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

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

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

如果您要使用 geth 执行此操作,则需要在发送之前解锁帐户。

如果没有私钥,该函数将抛出错误,因此您使用该授权方法是正确的。