Back

blockchain - web3.js 获得 transaction 中的常量: msg sender, gas, value, data等等

发布时间: 2022-06-07 23:11:00

refer to: https://codeforgeek.com/send-ethereum-to-message-sender-solidity/

msg 是全局可用的变量

包含了:

sender      ( msg.sender, 以下同)   0x ...

gas    

data

value

需要注意的msg.sender (或者说msg的作用域)

msg.sender 在不同方法下得到的结果应该是不同的。例如下面的代码:
 // 这个方法中的参数 recipient 就没问题。
  function mintNFT(address recipient, string memory tokenURI) public returns (uint256){
    _tokenIds.increment();
    uint256 newItemId = _tokenIds.current();
    _safeMint(recipient, newItemId);
    _setTokenURI(newItemId, tokenURI);
    return newItemId;
  }

// 这个方法中的 safeMint 中的参数 msg.sender 其实不是普通账户的地址,而是 00000000000...    
  function mint() public returns (uint256){
    _tokenIds.increment();
    uint256 newItemId = _tokenIds.current();
    _safeMint(address(msg.sender), newItemId);
    _setTokenURI(newItemId, "https://bigbanana.infura-ipfs.io/ipfs/QmX6RYeTT8W4MymKaY6eBtoReHCFkVTV2XByctjV91aERu");
    return newItemId;
  }

所以,可以看出, msg.sender 其实是会随着所在方法(或者说被调用上下文, caller )的变化而变化的。

所以最最保险的情况,就是 先声明出一个 变量, 然后调用 var = msg.sender 给该变量赋值,以后就直接使用该变量。

例如,上面一直有问题的方法  调用后会直接报错:

\"error\":\"Internal Server Error\",\"message\":\"Returned error: execution reverted: ERC721: mint to the zero address\"}"

解决办法:

把msg.sender抽取出一个临时变量,调用之。

Back