2016-04-15 82 views
0

我正在使用testrpc和web3。以太坊合同功能是否安全?

我用下面的成语,以确保只有先前定义的用户应该能够做一些事情:

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

     flagSomething = true; 
    } 

当调用与WEB3实例化合同的功能如下:

myContract.doSomethingProtected({ from: "0x..." }); 
它的工作原理是

。起初我很高兴,但后来我意识到web3 API并不要求我为私钥或诸如此类提供任何密码。

任何人都可以通过对某人公共密钥/地址的简单认识来调用这个函数吗?

在这些例子中使用这个成语使我相信以太坊合同的好处是它确保了msg.sender的加密保证。

回答

2

原因是您正在使用testRPC,它不锁定它的帐户,所以您不需要密码。

如果您是用geth来做这件事,那么您需要在发送之前解锁帐户。

如果没有私钥,该函数将抛出一个错误,所以您在使用该授权方法时是正确的。

2

在没有看到更多代码的情况下很难确定,但似乎您可能正在本地节点上调用合约,而不是发送事务。交易只能由拥有该账户私钥的人员签名,这意味着您可以依靠msg.sender准确无误,但在本地节点上执行的消息不会执行该操作。但是,他们所做的任何更改都将回滚并且不会应用于状态,因此,无论您的本地呼叫执行什么操作都无关紧要。

+0

我正在对testrpc节点运行它。也许这就是问题所在。 – Interition

0

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

1

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

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