вызов функции другого контракта динамически
Можно ли создать функцию в Solidity, которая вызывала бы произвольную функцию на произвольном контракте со всеми параметрами?
В JavaScript я бы написал что-то вроде этого
function callArbitrary(contract, func, params){
contract[func](params);
}
есть ли версия целостности?
1 ответ
4
Это обычно не рекомендуется, если вы не уверены, что делаете, поскольку он может открыть много дыр в безопасности, и лучше всего только называть контракты, которые известны заранее.
Тем не менее, техника выглядит так:
address myContract = 0xabcdef....;
myContract.call.gas(msg.gas-3000).value(1 ether)(bytes4(sha3("myFunction(uint256,bytes32,string)")), 42, 0xabc, "hello")
По существу, вы используете метод call
, а затем используйте gas
и value
, чтобы добавить газ и значение (вы можете опустить значение, если оно равно 0) , Затем вы передаете первые 4 байта хэша sha3 функции, которую вы хотите вызвать.
ответил Tjaden Hess 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 29 Sep 2016 23:41:25 +0300 2016, 23:41:25