0

我正在使用 testrpc 和 web3。

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

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

        flagSomething = true;
   }

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

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

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

对某人的公钥/地址有简单了解的人可以调用这个函数吗?

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

4

4 回答 4

2

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

于 2016-04-15T13:48:04.987 回答
2

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

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

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

于 2016-04-15T14:14:02.740 回答
1

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

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

于 2016-04-15T13:54:36.690 回答
0

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

于 2016-04-15T13:50:08.653 回答