Я пытаюсь вызвать функцию контракта из бэкэнда 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");
Есть ли другие способы выполнить функцию контракта? Должен ли я запускать свой собственный узел вместо общедоступного?
Порт узла открыт.
Проблема была в инициализации клиента 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"