以太坊合同功能是否可以保证?

时间:2016-04-15 13:31:48

标签: ethereum solidity truffle

我正在使用testrpc和web3。

我使用下面的习惯用法来确保只有先前定义的用户才能做某事:

<div class="container-fluid" id="portfolio-images">
  <ul>
    <li>
      <img class="portfolio-image img-responsive" src="http://i64.tinypic.com/2ltg2h4.jpg">
      <h3>kitty</h3>
      <p>ipsum kitty itsum sit on the fur watching the grass. grass shine in sun burning bright light on the buildings. fan schemrring in the light. house painted yellow, black and red.</p>
    </li>
    <li>
      <img src="http://i64.tinypic.com/2ltg2h4.jpg" alt="devops" class="portfolio-image img-responsive">
      <h3>kitty</h3>
      <p>ipsum kitty itsum sit on the fur watching the grass. grass shine in sun burning bright light on the buildings. fan schemrring in the light. house painted yellow, black and red.</p>
    </li>
    <li>
      <img src="http://i64.tinypic.com/2ltg2h4.jpg" alt="devops" class="portfolio-image img-responsive">
      <h3>kitty</h3>
      <p>ipsum kitty itsum sit on the fur watching the grass. grass shine in sun burning bright light on the buildings. fan schemrring in the light. house painted yellow, black and red.</p>
    </li>    
    
  </ul>
</div>

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

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

        flagSomething = true;
   }

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

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

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

4 个答案:

答案 0 :(得分:2)

如果没有看到更多代码,很难确定,但似乎您在本地节点上调用合同,而不是发送事务。交易只能由拥有该帐户私钥的人签名,这意味着您可以依赖msg.sender准确,但在本地节点上执行的邮件不会强制执行该操作。但是,它们所做的任何更改都会回滚,而不会应用于州,因此,本地电话的作用并不重要。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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