blockchain - web3.js 获得 transaction 中的常量: msg sender, gas, value, data等等
访问量: 781
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抽取出一个临时变量,调用之。