我正在尝试通过委托实现可升级的功能。本质上,contract A
的后备功能是以这样的方式实现的:当在F
上调用函数contract A
时,执行被委派给函数F
(相同的函数signature(on contract B
。
回调函数如下
function() external payable {
address delegate = delegates[msg.sig];
require(delegate != address(0), "Function does not exist.");
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize)
let result := delegatecall(gas, delegate, ptr, calldatasize, 0, 0)
let size := returndatasize
returndatacopy(ptr, 0, size)
switch result
case 0 {revert(ptr, size)}
default {return (ptr, size)}
}
}
当尝试使用web3.py调用上述F
中的函数contract A
时遇到问题。我尝试了一些不同的事情:
// Case 1
Contract.functions.F().buildTransaction()
^,这导致web3.py抱怨函数F不在contract A
的ABI中。因此,我以为后备函数将msg.sig
用作函数签名,因此我尝试将签名作为“数据”传递。
// Case 2
Contract.fallback.buildTransaction({'data': "0x61455567"})
// 0x61455567 == bytes4(keccak256("updateContract(address,string,string)"))
也不起作用,因为web3.py表示在建立事务时无法调用“数据”。最后,我认为我可以在建立交易后通过data
字段,所以我做到了:
// Case 3
txn_hash = Contract.fallback.buildTransaction({'gas': 1000000})
txn_hash['data'] = "0x837b4bd1"
这次,web3.py没有抱怨,但是交易在区块链上(在Rinkeby测试网上)失败了。
有关如何使用web3.py调用自定义后备功能的帮助吗?
答案 0 :(得分:0)
您只需使用sendTransaction
,然后它将进入后备功能。
web3.eth.sendTransaction({'to': contractAddress, 'from': yourAddress, 'data': "0x61455567"})
编辑:
您还可以在本地reference
签署交易