Умный код контракта не работает через Nethereum, но выполняется в другом месте - PullRequest
0 голосов
/ 15 мая 2019

У меня есть функция по умному контракту, которую я пытаюсь вызвать через C # / Nethereum.Этот код запускается, когда я запускаю модульный тест в js.Я также протестировал его в Remix IDE, и он работает.

Когда я вызываю этот код в Nethereum, я получаю сообщение об ошибке виртуальной машины, и транзакция отменяется.

Ошибка, которую я получаю:

[15.05.2009 14:27:14] System.Private.CoreLib: Исключительная ситуация при выполнении функции: DeployContractManager.Nethereum.JsonRpc.Client: Исключение виртуальной машины при обработке транзакции: возврат.

Кто-нибудь сталкивался с этим раньше или есть какое-либо понимание того, что мне следует попытаться определить проблему?

ВотКонтракт о надежности:


pragma solidity >=0.4.21 <0.6.0;
import "./ContractManager.sol";

contract ContractManagerFactory {
    mapping(bytes32 => address) addresses;

    function createManager(address supplier, address customer) public returns(address) {
        bytes32 key = keccak256(abi.encodePacked(supplier, customer));
        ContractManager cm = new ContractManager(supplier, customer);
        addresses[key] = address(cm);
        return addresses[key];
    }

    function getAddress(address supplier, address customer) public view returns(address) {
        bytes32 key = keccak256(abi.encodePacked(supplier, customer));
        return addresses[key];
    }
}

Вот тест JS (работает):

    it("can create contract manager and get its address", async() => {
        await factory.createManager(supplier, customer, {from:supplier});
        const addr = await factory.getAddress(supplier, customer, {from:supplier});
        console.log(addr);
    });

Вот код C # (который не работает):

    public class ContractManagerFactoryProxy
    {
        private readonly Web3 _web3;
        private readonly string _address;

        //I have had issues getting this to work, so I have been manually
        //deploying 
        public ContractManagerFactoryProxy(string providerUrl)
        {
            //this should be a fixed address
            _web3 = new Web3(providerUrl);
            _address = "0xD47a082BcF57E696F425d86fE17430Bc05666a69";
        }

        public async Task<string> CreateManager(string saddr, string caddr, string from)
        {
            var msg = _web3.Eth.GetContractTransactionHandler<CreateManagerMessage>();

            var tx = await msg.SendRequestAsync(
                _address, 
                new CreateManagerMessage
                {
                    FromAddress = from,
                    Supplier = saddr,
                    Customer = caddr
                });

            return tx;
        }
    }

    [Function("createManager", "address")]
    public class CreateManagerMessage : FunctionMessage
    {
        [Parameter("address", "supplier")] public string Supplier { get; set; }
        [Parameter("address", "customer")] public string Customer { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...