Функция контракта Nethereum вызывает исключение при возврате: шестнадцатеричная строка имеет длину 64, требуется 40 для общего адреса.

И возврат вызова, и адрес, и вызов, возвращающий int256, терпят неудачу с той же ошибкой:

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

Код С#:

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.");
        }
    }
}

Код контракта солидности:

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;}
    }

}

Как мне получить возвращаемые значения?

Ответы (1)

Я думаю, проблема в том, что Test08Addressхэш транзакции хранится, и, следовательно Test08ContractAddress, . Вам нужно получить адрес из квитанции о транзакции и использовать его для совершения звонков.