我正在编写ERC777TokensRecipient的实现。所以这意味着一个函数
function tokensReceived(address operator, address from, address to, uint256 amount, bytes data, bytes operatorData) external;data字段包含14个uint256变量
0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e我如何才能访问这些变量?
我知道我可以让他们这样:
function tokensReceived(address _operator, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external {
uint arg1;
uint arg2;
uint arg3;
uint arg4;
uint arg5;
uint arg6;
uint arg7;
uint arg8;
uint arg9;
uint arg10;
uint arg11;
uint arg12;
uint arg13;
uint arg14;
bytes memory tmp = _data;
assembly {
arg1 := mload(add(0x020, tmp))
arg2 := mload(add(0x040, tmp))
arg3 := mload(add(0x060, tmp))
arg4 := mload(add(0x080, tmp))
arg5 := mload(add(0x0A0, tmp))
arg6 := mload(add(0x0C0, tmp))
arg7 := mload(add(0x0E0, tmp))
arg8 := mload(add(0x100, tmp))
arg9 := mload(add(0x120, tmp))
arg10 := mload(add(0x140, tmp))
arg11 := mload(add(0x160, tmp))
arg12 := mload(add(0x180, tmp))
arg13 := mload(add(0x1A0, tmp))
arg14 := mload(add(0x1C0, tmp))
}
}但是,在遇到
CompilerError: Stack too deep, try removing local variables.根据编译时出错:堆栈太深的说法,解决办法是把当地的uints放到一个数组中。但我不知道怎么做。
有人知道我怎么写这样的函数吗?
function convertToArrayOfLength14(bytes memory data) internal pure returns (uint[]) {
// TODO
}发布于 2018-12-12 15:46:14
你可以在这样的循环中这样做:
function convertToArrayOfLength14(bytes memory data) public pure returns (uint256[] memory output)
{
output = new uint256[](14);
for (uint256 i=32; i<=output.length*32; i+=32)
{
assembly { mstore(add(output, i), mload(add(data, i))) }
}
}https://ethereum.stackexchange.com/questions/63994
复制相似问题