美文网首页
Solidity中的常用变量

Solidity中的常用变量

作者: 绿杨烟外晓寒轻_ | 来源:发表于2020-03-16 18:26 被阅读0次

tx.origin 和 msg.sender

tx.origin遍历整个调用栈,返回最初的调用者地址
msg.sender返回当前调用者地址

例子

合约1

contract Telephone {

  address public owner;

  function Telephone() public {
    owner = msg.sender;
  }

  function changeOwner(address _owner) public {
    if (tx.origin != msg.sender) {
      owner = _owner;
    }
  }
}

合约2

contract HackTelephone {

  address public contractAddr = 0x9e...; // Telephone 合约地址

  Telephone telephone = Telephone(contractAddr);

  function changeowner() public  {
    telephone.changeOwner(msg.sender);
  }
}

合约2这样调用合约1的函数时,避开了限制,改变了owner值,这是因为合约1中的msg.sender 变为合约2地址,tx.orgin 为执行合约2的人。

Never use tx.origin for authorization.

用途

在智能合约的鉴权机制中不应使用tx.origin。不是说绝对不能用tx.origin变量。该变量还是有合理的使用场景的。比如, 如果想要控制外部合约调用本合约,可以使用require(tx.origin == msg.sender). 这个语句防止一些中间的合约来调用本合约,限制本合约仅可供常用的codeless地址访问。

我们通常使用tx.origin来区分调用者是一个账户而不是一个合约。

if(msg.sender == tx.origin)

如果调用者是一个账户,上面的条件永远是True。如果是合约账户,则条件就为False.

引用自该文

相关文章

网友评论

      本文标题:Solidity中的常用变量

      本文链接:https://www.haomeiwen.com/subject/auanehtx.html