Nethereum "WebException: Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung wurde unerwartet geschlossen."

Ich versuche, eine Vertragsfunktion vom asp.net-Backend mit einem öffentlichen Knoten aufzurufen.

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

Und immer bekomme ich diese WebException. Auch wenn ich nur meinen Kontostand abfrage:

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

Gibt es andere Möglichkeiten, die Vertragsfunktion auszuführen? Muss ich meinen eigenen Knoten statt öffentlich betreiben?

Der Port des Knotens wird geöffnet.

Antworten (2)

Das Problem lag in der Initialisierung des Geth-Clients. Es sollte mit diesen Argumenten gestartet werden (rpc ist am wichtigsten):

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

Wahrscheinlich haben die öffentlichen Knoten, die ich zu verwenden versuchte, dies nicht aktiviert. Wenn Sie keinen eigenen Knoten benötigen, können Sie einfach Infura verwenden. Es ist nicht nur ein REST-API-Dienst, wie ich zuvor dachte.

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

Initialisieren Sie geth korrekt und erlauben Sie den Zugriff auf bestimmte APIs

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

Sie haben andere APIs, stellen Sie also sicher, dass Sie geth mit den richtigen aktivierten APIs gestartet haben, auf die Sie mit Nethereum zugreifen möchten.

Hier ist ein Beispiel für die verfügbaren APIs

{  
 "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"
}

Dieser Parameter ist nützlich, wenn Sie über einen Browser auf den Geth-Knoten zugreifen. Sie können "*" eingeben, aber ich würde es nicht empfehlen, da es jedem ermöglicht, sich mit dem Knoten zu verbinden und ihn zu verwalten. Wenn ich geth lokal ausführe und lokal damit interagiere, verwende ich localhost oder 127.0.0.1

--rpccorsdomain "http://localhost"