我正在使用testrpc和web3。
我使用下面的成语来确保只有先前定义的用户才能做一些事情:
function doSomethingProtected() {
if ( msg.sender != authorizedUser )
throw;
flagSomething = true;
}在使用web3实例化的合同上调用函数时,如下所示:
myContract.doSomethingProtected( { from: "0x..." } );啊,真灵。起初,我很高兴,但后来我意识到,web3 API没有要求我为私钥或类似的东西提供任何密码。
任何人只要了解某个人的公钥/地址,就能调用这个函数吗?
这个成语在例子中的使用使我相信Ethereum合同的一个好处是它确保了msg.sender在密码上得到了保证。
发布于 2016-04-15 14:14:02
原因是您使用的是testRPC,它不锁定帐户,因此不需要密码。
如果您要使用geth进行此操作,则需要在发送帐户之前将其解锁。
如果没有私钥,该函数将抛出一个错误,因此您使用该授权方法是正确的。
发布于 2016-04-15 13:48:04
在不看到更多代码的情况下很难确定,但似乎您是在本地节点上调用契约,而不是发送事务。事务只能由拥有帐户私钥的人签名,这意味着您可以依赖msg.sender才能准确,但是在本地节点上执行的消息不会强制执行。但是,它们所做的任何更改都会回滚,而不会应用于状态,因此您的本地调用做什么并不重要。
发布于 2016-04-15 13:54:36
通常,从web3.js调用函数有两种方法:使用事务或只使用“调用”。只有在事务中,才能实际修改区块链内容(读取始终是可能的)。事务总是需要有效的签名,因此需要访问私钥。
您没有被要求提供密码的原因可能是您已经解锁了帐户。此外,除了授权用户之外,其他用户可以调用该函数,只有更改才会被丢弃。
https://stackoverflow.com/questions/36648596
复制相似问题