Llamada de función de contrato de Nethereum que arroja una excepción al regresar: la cadena hexadecimal tiene una longitud de 64, quiere 40 para common.Address

Tanto una devolución de llamada y una dirección como una llamada que devuelve un int256 fallan con el mismo error:

Nethereum.JsonRpc.Client.RpcResponseException
  HResult=0x80131500
  Message=invalid argument 0: hex string has length 64, want 40 for common.Address
  Source=Nethereum.Portable
  StackTrace:
   at Nethereum.JsonRpc.Client.RpcClient.HandleRpcError(RpcResponseMessage response) in H:\Projects\BlockChain\Ethereum\Oricals\Nethereum-master\src\Nethereum.JsonRpc.RpcClient\RpcClient.cs:line 67

El código C# es:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Nethereum.Web3;
using Nethereum.Web3.Accounts;
using Nethereum.Contracts;
using Nethereum.Hex.HexTypes;
using Nethereum.RPC.Eth.DTOs; //using Nethereum.Geth;


namespace Test08
{
    class Program
    {
        class AccountClass
        {
            string privateKey; // = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
            string senderAddress; // = "0x12890d2cce102216644c59daE5baed380d84830c";
            string password;
            Account account; // = new Account(privateKey);

            public string getPrivateKey() { return (privateKey); }
            public string getSenderAddress() { return (senderAddress); }
            public string getPassword() { return (password); }
            public Account getAccount() { return (account); }


            public void setPrivateKey(string inPrivateKey) { privateKey = inPrivateKey; }
            public void setSenderAddress(string inSenderAddress) { senderAddress = inSenderAddress; }
            public void setPassword(string inPassword) { password = inPassword; }

            public void setAccount(Account inAccount) { account = inAccount; }

            public AccountClass(string inPrivateKey, string inSenderAddress, string inPassword, Account inAccount)
            {
                privateKey = inPrivateKey;
                senderAddress = inSenderAddress;
                password = inPassword;
                account = inAccount;
            }
        };


        class SyncFunction : Nethereum.Contracts.Function
        {
            public SyncFunction(Contract contract, FunctionBuilder functionBuilder) : base(contract, functionBuilder)
            {

            }

            public async Task<TransactionReceipt> SendTransactionAndWaitForReceiptSync(string from, CancellationTokenSource receiptRequestCancellationToken = null, params object[] functionInput)
            {
                return (await SendTransactionAndWaitForReceiptAsync(from, receiptRequestCancellationToken, functionInput));
            }

            public async Task<TransactionReceipt> SendTransactionAndWaitForReceiptSync(TransactionInput input, CancellationTokenSource receiptRequestCancellationToken = null, params object[] functionInput)
            {
                return (await SendTransactionAndWaitForReceiptAsync(input, receiptRequestCancellationToken, functionInput));
            }

        }

        public static async Task<uint> RetrieveInt(Contract contract, string FunctionName)
        {
            var FunctionAddress = contract.GetFunction(FunctionName);

            Console.WriteLine("Calling " + FunctionName + ":");

            var result2 = await FunctionAddress.CallAsync<uint>();

            Console.WriteLine(FunctionName + " Returned: " + result2);

            return (result2);
        }

        public static async Task<string> RetrieveAddress(Contract contract, string FunctionName)
        {
            var FunctionAddress = contract.GetFunction(FunctionName);

            Console.WriteLine("Calling " + FunctionName + ":");

            var result2 = await FunctionAddress.CallAsync<string>();

            Console.WriteLine(FunctionName + " Returned: " + result2);

            return (result2.ToString());
        }



        static async Task Main(string[] args)
        {
            AccountClass Tester = new AccountClass("",
                                            "0x0795e077E62Ae7565d589713b4c6D547f5185FC7",
                                            "PrivateTest001",
                                            null);


            string Test08Address = "0x9dB5E63F4319Ec4B2c0403C0bDeA43D864D94FC0";
            string Test08ABI = File.ReadAllText("Test08ABI.txt");
            string Test08BIN = File.ReadAllText("Test08BIN.txt");
            string Test08ByteCode = File.ReadAllText("Test08ByteCode.txt");


            var BasicWeb3 = new Web3();

            var client = BasicWeb3.Client;

            var web3 = new Nethereum.Geth.Web3Geth(client);

            var unlockAccountResult = await web3.Personal.UnlockAccount.SendRequestAsync(Tester.getSenderAddress(), Tester.getPassword(), 120);
            Debug.Assert(unlockAccountResult);

            try
            {
                var mineResult = await web3.Miner.Start.SendRequestAsync(6);
            }
            catch (Exception e)
            {
                Console.WriteLine("Miner Start reported a Failure: " + e.Message);
                Console.WriteLine();
            }

            HexBigInteger gas = new HexBigInteger(4000000);

            Test08Address = await web3.Eth.DeployContract.SendRequestAsync(Test08ABI, Test08BIN, Tester.getSenderAddress(), gas);


            var receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(Test08Address);

            while (receipt == null)
            {
                Thread.Sleep(5000);
                receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(Test08Address);
            }

            //mineResult = await web3.Miner.Stop.SendRequestAsync();
            try
            {
                var mineResult = await web3.Miner.Stop.SendRequestAsync();
            }
            catch (Exception e)
            {
                Console.WriteLine("Miner Stop reported a Failure: " + e.Message);
                Console.WriteLine();
            }

            var Test08ContractAddress = Test08Address;

            var contract = web3.Eth.GetContract(Test08ABI, Test08ContractAddress);

            // test of get int
            uint result;

            result = await RetrieveInt(contract, "getTestAFee"); // retrieve value and display to console

            result = await RetrieveInt(contract, "getTestBFee"); // retrieve value and display to console

            result = await RetrieveInt(contract, "getTestcFee"); // retrieve value and display to console

            result = await RetrieveInt(contract, "getTesterFee"); // retrieve value and display to console

            string AddressResult;

            AddressResult = await RetrieveAddress(contract, "getTester"); // retrieve value and display to console


            Console.WriteLine("Test08 Contract Calls complete.");
        }
    }
}

El código del contrato de solidez:

pragma solidity ^0.4.17;


contract Test08 {

    address Creator;  // Creating address
    address TesterAddress;  // Owner of this Test

    uint TesterFee;
    uint TestAFee;
    uint TestBFee;
    uint TestcFee;
    uint TestCount;

    address TokenAddress;

//    function Test08(uint inTesterFee, uint inTestAFee, uint inTestBFee, uint inTestcFee, address token) public {
    function Test08() public {

        TesterAddress = msg.sender;
        TesterFee = 5; // inTesterFee;
        TestAFee = 6; // inTestAFee;
        TestBFee = 7; // inTestBFee;
        TestcFee = 8; // inTestcFee;
        Creator = msg.sender;
        TokenAddress = 1234; // token;
        TestCount = 0;
    }


  /* The function without name is the default function that is called whenever anyone sends funds to a contract */
    function () public payable {
    }


    function getTesterFee() public view returns (uint) {return(TesterFee);}
    function getTestAFee() public view returns (uint) {return(TestAFee);}
    function getTestBFee() public view returns (uint) {return(TestBFee);}
    function getTestcFee() public view returns (uint) {return(TestcFee);}
    function getTester() public view returns (address) {return(Creator);}

    function setTesterFee(uint inTesterFee) public {
        if (msg.sender == Creator) {TesterFee = inTesterFee;}
    }

    function setTestAFee(uint inTestAFee) public {
        if (msg.sender == Creator) {TestAFee = inTestAFee;}
    }

    function setTestBFee(uint inTestBFee) public {
        if (msg.sender == Creator) {TestBFee = inTestBFee;}
    }

    function setTestcFee(uint inTestcFee) public {
        if (msg.sender == Creator) {TestcFee = inTestcFee;}
    }

}

¿Cómo obtengo mis valores de retorno?

Respuestas (1)

Creo que el problema es que Test08Addresscontiene el hash de la transacción y, por lo tanto, también lo hace Test08ContractAddress. Debe obtener la dirección del recibo de la transacción y usarla para hacer sus llamadas.