Nethereum «WebException: базовое соединение было закрыто: соединение было неожиданно закрыто».

Я пытаюсь вызвать функцию контракта из бэкэнда asp.net, используя общедоступный узел.

            var abi = 
            @"[{""constant"":false,""inputs"":
[{""name"":""addr"",""type"":""address""},
{""name"":""amount"",""type"":""uint256""}],""name"":""test1"",""outputs"":
[{""name"":"""",""type"":""bool""}],
""payable"":false,""stateMutability"":""nonpayable"",""type"":""function""},
{""constant"":false,""inputs"":[{""name"":""addr"",""type"":""address""},
{""name"":""amount"",""type"":""uint256""}],""name"":""test2"",
""outputs"":[{""name"":"""",""type"":""bool""}],
""payable"":false,""stateMutability"":""nonpayable"",""type"":""function""},
{""anonymous"":false,""inputs"":
[{""indexed"":false,""name"":"""",""type"":""address""},
{""indexed"":false,""name"":"""",""type"":""uint256""}],
""name"":""Test1"",""type"":""event""},
{""anonymous"":false,""inputs"":
[{""indexed"":false,""name"":"""",""type"":""address""},
{""indexed"":false,""name"":"""",""type"":""uint256""}],
""name"":""Test2"",""type"":""event""}]";

        var account = new Nethereum.Web3.Accounts.Account("private-key-here");
        var web3 = new Nethereum.Geth.Web3Geth(acc, "http://104.236.182.85:30303");
        var contract = web3.Eth
.GetContract(abi, "0xcff863b8f953caf4418c50d56f2cc5afc839be01");
        var myFunction = contract.GetFunction("test1");
        var result = await myFunction
.CallAsync<bool>("d56F18bD24557E75E1b0082B66d6B9f5134Ed1da", 2);

И всегда я получаю это WebException. Даже когда я просто запрашиваю баланс своего счета:

var balance = await web3.Eth.GetBalance
.SendRequestAsync("d56F18bD24557E75E1b0082B66d6B9f5134Ed1da");

Есть ли другие способы выполнить функцию контракта? Должен ли я запускать свой собственный узел вместо общедоступного?

Порт узла открыт.

Ответы (2)

Проблема была в инициализации клиента geth. Его следует начать с такими аргументами (наиболее важным является rpc):

geth --rpc --rpcaddr <ip> --rpcport <portnumber>

Вероятно, общедоступные узлы, которые я пытался использовать, не включали это. Если вам не нужен собственный узел, вы можете просто использовать Infura. Оказалось, что это не просто сервис REST API, как я думал раньше.

var web3 = new Nethereum.Geth.Web3Geth(acc, url: "https://mainnet.infura.io");

Правильно инициализируйте geth и разрешите доступ к определенным API

geth --rpc <ip> --rpcapi eth,web3 --rpccorsdomain "http://localhost"

У вас есть другие API, поэтому убедитесь, что вы запустили geth с правильными включенными API, к которым вы хотите получить доступ с помощью Nethereum.

Вот пример доступных API

{  
 "id":1,
 "jsonrpc":"2.0",
 "result":{  
  "admin":"1.0",
  "db":"1.0",
  "debug":"1.0",
  "eth":"1.0",
  "miner":"1.0",
  "net":"1.0",
  "personal":"1.0",
  "shh":"1.0",
  "txpool":"1.0",
  "web3":"1.0"
}

Этот параметр полезен при доступе к узлу geth из браузера, вы можете поставить «*», но я бы не рекомендовал его, так как он позволяет любому подключаться и управлять узлом. Если я запускаю geth локально и взаимодействую с ним локально, я буду использовать localhost или 127.0.0.1.

--rpccorsdomain "http://localhost"