在稳固性中,可以创建一个字节数组,然后使用address.call(bytesData)创建与函数签名匹配的新事务,以及传递参数。
例如,我们可以做address.call(bytes4(bytes32(sha3("someFunction(uint256,address)"))), 10, 0x42)。只需传递另一个字节变量,就可以动态地创建函数签名。但是,如何使动态争论也成为可能呢?
就像这样。但是functionSig & encoded_params是在坚实的基础上创建的。
function doSomething() {
if(someCondition) {
bytes memory data = functionSig + encoded_params.
toAddress.call(data);
}
}我想要能在坚固的工艺下完成这个。不是从外部使用web3或其他一些编码函数吗?有什么简单的方法吗?还是应该编写一个可靠的编码函数,将参数转换为字节并创建此消息数据?
发布于 2016-06-16 21:12:49
要做到这一点,您需要为要传递的参数实现适当的RLP编码。
RLP规格:https://github.com/ethereum/wiki/wiki/RLP
对于简单的非数组固定长度类型,这就像将func_sig + arg_1_as_bytes + arg_2_as_bytes连接成单个字节值并将其传递到address.call(...)一样简单。
对于数组、bytes、string或structs这样的复杂类型,您必须做更复杂的事情来为数据构造适当的RLP字节表示。
有可靠的关键跟踪器中的一个故事来创建encode和decode函数,这些函数将为您执行这种编码。
https://ethereum.stackexchange.com/questions/4251
复制相似问题