使用web3.py调用自定义以太坊后备功能

时间:2019-12-05 05:29:54

标签: ethereum solidity web3

我正在尝试通过委托实现可升级的功能。本质上,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调用自定义后备功能的帮助吗?

1 个答案:

答案 0 :(得分:0)

您只需使用sendTransaction,然后它将进入后备功能。

web3.eth.sendTransaction({'to': contractAddress, 'from': yourAddress, 'data': "0x61455567"})

编辑:

您还可以在本地reference

签署交易