以太坊合约功能是否安全



我正在使用testrpc和web3。

我使用了下面的习惯用法来确保只有以前定义的用户才能做一些事情:

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

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

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

它奏效了。一开始我很高兴,但后来我意识到web3 API不要求我提供任何私钥密码或类似密码。

任何对某人的公钥/地址有简单了解的人都能调用此函数吗?

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

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

如果你要用geth做这件事,你需要在发送之前解锁帐户。

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

如果看不到更多的代码,很难确定,但很可能是在本地节点上调用合约,而不是发送事务。交易只能由某人使用帐户的私钥进行签名,这意味着您可以依靠msg.sender进行准确签名,但在本地节点上执行的消息不会强制执行这一点。不过,他们所做的任何更改都会回滚,并且不会应用于状态,所以本地调用的作用并不重要。

通常,有两种方法可以从web3.js调用函数:使用事务或仅使用"调用"。只有在交易中,您才能实际修改区块链内容(阅读始终是可能的)。交易总是需要有效的签名,因此需要访问私钥。

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

我的猜测是,在调用函数时,您的帐户已经解锁。我不记得你的账户在web3中解锁后的确切解锁时间。不过我可能错了。我本想把它作为一个评论来添加,但我现在不被允许。

最新更新