Schätzgas für Smart Contract schlägt immer fehl

Ich habe einen sehr einfachen Vertrag für die Ethereum-Blockchain bereitgestellt, um eine Zahlung auf zwei verschiedene Ausgänge aufzuteilen.

pragma solidity ^0.5.0;

contract MoonTrade
{
    function multiSendETH(  address payable address1,
                            uint value1,
                            address payable address2,
                            uint value2) public payable
    {
        address1.transfer(value1);
        address2.transfer(value2);

        msg.sender.transfer(address(this).balance);
    }
}

Es befindet sich im Ropsten-Testnet. https://ropsten.etherscan.io/address/0x3376a6d3e46496944fe7afd838efb949007b80f4

Ich verwende web3py (Python)

Wenn ich es jedoch versuche, web3.eth.estimateGas()bekomme ich immer eine Fehlermeldung, die besagt:

Benötigtes Gas übersteigt den Freibetrag oder Transaktion schlägt immer fehl (Fehlercode -32000)

Ich bin mir nicht sicher, was ich hier falsch mache.

Hier ist die Eingabe, die ich übergebe, um das Gas zu schätzen:

{'to': 0x3376a6D3e46496944fe7afD838EfB949007B80f4, 
    'from': 0xF811E7eD1BBc908f33b1C298087220D249bE0464, 
    'value': 50000000000000000, 
    'data': b'{"name": "multiSendETH", "types": ["address","uint256","address","uint256"],"inputs":["0xbe623C1f9F47d2105f80A9A5c0Cd90562be5fA58", "40000000000000000","0x366de12a1A6fd0B140153f011c1A085314A047BC", "10000000000000000"]}'}

Der Datenteil wird offensichtlich in Bytes umgewandelt, web3.toBytes()bevor er in die Schätzgasfunktion geleitet wird.

Ich bin mir nicht sicher, ob dieser Fehler mit meinem Smart Contract oder der Art und Weise zusammenhängt, wie ich die Parameter an das Schätzgas übergebe.

Irgendwelche Ideen?

Hier ist meine Debug-Ausgabe:

ABI: [{"constant": false,"inputs": [{"name": "address1","type": "address"},{"name": "value1","type": "uint256"},{"name": "address2","type": "address"},{"name": "value2","type": "uint256"}],"name": "multiSendETH","outputs": [],"payable": true,"stateMutability": "payable","type": "function"}]

Contract address: 0x60946D10048EC9fbB0A260bb17da2eFEbdb76F12

Estimate gas data: {'to': 0x60946D10048EC9fbB0A260bb17da2eFEbdb76F12, 'from': 0xF811E7eD1BBc908f33b1C298087220D249bE0464, 'value': 50000000000000000, 'data': b'{"name": "multiSendETH", "types": ["address","uint256","address","uint256"],"inputs":["0xbe623C1f9F47d2105f80A9A5c0Cd90562be5fA58", "40000000000000000","0x366de12a1A6fd0B140153f011c1A085314A047BC", "10000000000000000"]}'}

Total gas fee in WEI: 6600000000000000

Gas price in WEI: 22000000000

Transaction data to be used: {"name": "multiSendETH", "types": ["address","uint256","address","uint256"],"inputs":["0xbe623C1f9F47d2105f80A9A5c0Cd90562be5fA58", "33400000000000000","0x366de12a1A6fd0B140153f011c1A085314A047BC", "10000000000000000"]}

Signed transaction: AttrDict({'rawTransaction': HexBytes('0xf901488085051f4d5c00830493e09460946d10048ec9fbb0a260bb17da2efebdb76f1287b1a2bc2ec50000b8db7b226e616d65223a20226d756c746953656e64455448222c20227479706573223a205b2261646472657373222c2275696e74323536222c2261646472657373222c2275696e74323536225d2c22696e70757473223a5b22307862653632334331663946343764323130356638304139413563304364393035363262653566413538222c20223333343030303030303030303030303030222c22307833363664653132613141366664304231343031353366303131633141303835333134413034374243222c20223130303030303030303030303030303030225d7d1ba0ba8a017590df650113bbe37c75271013750180e3464145b174baa39318d4d5c4a076c352add8de85ae019ee52949afb54d2a30105e1abe0cc70cd6fef351dbff4c'), 'hash': HexBytes('0x6f4e47b48d1c4e37fc360d97f5e15a05e6100a6058b33442419617c536690e33'), 'r': 84374024802743941308955771074764079224633082170439044639020403769288422643140, 's': 53718021940567424333967254769074396806767762625919492526766162521994190126924, 'v': 27})

Gas: 3E-13

Gas price: 2.2E-8

Value: 0.05

Gas * gasprice + value = 0.0566

{"error":"{'code': -32000, 'message': 'insufficient funds for gas * price + value'}"}

Antworten (1)

Das Problem mit dem Aufrufen von taxGas besteht darin, dass Sie eine ungültige Transaktion übergeben, die einen ungültigen Bytecode enthält.

'data': b'{"name": "multiSendETH", "types": ["address","uint256","address","uint256"],"inputs":["0xbe623C1f9F47d2105f80A9A5c0Cd90562be5fA58", "40000000000000000","0x366de12a1A6fd0B140153f011c1A085314A047BC", "10000000000000000"]}'}

^ stimmt nicht.

Das richtige Format sieht in etwa so aus:0x23b872dd000000000000000000000000bb9bc244d798123fde783fcc1c72d3bb8c189413000000000000000000000000713fa27cb26b5902ea398b04d21e6018bba3a2f100000000000000000000000000000000000000000000000072ae557d778bd174

Um die Transaktion zum Aufrufen von Smart Contract-Funktionen richtig zu erstellen, können Sie auf https://web3py.readthedocs.io/en/stable/contracts.html#web3.contract.ContractFunction.buildTransaction verweisen