Как вызвать сложную функцию с несколькими входными параметрами и несколькими выходными параметрами, используя Nethereum в .net core 2.2 - PullRequest
0 голосов
/ 08 ноября 2019

Здравствуйте, в эти дни я создаю децентрализованный веб-API с использованием .net core 2.2 и библиотеки nethereum. Сейчас я нахожусь в критической ситуации, потому что, когда я пытаюсь вызвать функцию умного контракта, которая имеет несколько входных и выходных параметров через nethereum, произошла следующая ошибка.

Произошло необработанное исключение при обработке запроса.

NotSupportedException: System.Int32 не поддерживается

Nethereum.ABI.Decoders.StringTypeDecoder.Decode (byte [byte [] закодировано, введите тип)

Я гуглю по этому поводу, но любая найденная статья не помогла мне решить эту проблему. Поэтому, если кто-нибудь может мне помочь, я очень признателен.


Вот моя умная контрактная функция

function test(string memory x, uint256 y, bool z) public view returns(string memory _x,
    uint256 _y, bool _z){
            return(x, y, z);
    }

Вот мой подход к вызовуфункция, использующая ядро ​​.net

[FunctionOutput]
    public class Test : IFunctionOutputDTO
    {
        [Parameter("string", "_x", 1)]
        private string X { get; set; }

        [Parameter("uint256", "_y", 2)]
        private bool Y { get; set; }

        [Parameter("bool", "_z", 3)]
        private bool Z { get; set; }


    [Function("test")]
    public class TestFunction : FunctionMessage
    {
        [Parameter("string", "x", 1)]
        public string X { get; set; }
        [Parameter("uint256", "y", 2)]
        public string Y { get; set; }
        [Parameter("bool", "z", 3)]
        public bool Z { get; set; }
    }

Внутри моей службы я вызываю контракт

public async Task<Test> Test(TestBody body)
        {
            var dataset = new TestFunction
            {
                X = body.x,
                Y = body.y,
                Z = body.z
            };
            var testHandler = web3.Eth.GetContractQueryHandler<TestFunction>();
            var response = await testHandler.QueryDeserializingToObjectAsync<Test>(dataset, contractAddress);
            return response;
        }

Здесь тело это просто объект сопоставленного тела запроса с

public string x; 
public BigInteger y; 
public bool z;

1 Ответ

0 голосов
/ 09 ноября 2019

Я понятия не имею, как работает эта библиотека или умные контракты в этом отношении, но, просто глядя на ваши параметры и типы, похоже, что в вашем DTO установлен неправильный тип:

    [Parameter("uint256", "_y", 2)]
    private bool Y { get; set; }

Разве это не должно быть беззнаковым целым?

...