У меня есть testrpc, работающий на виртуальной машине (Ubuntu 16.04), и он работает правильно, когда я взаимодействую с ним с помощью консоли truffle.
Моя единственная цель — вызвать смарт-контракт, который просто отправляет эфир с одной учетной записи на другую. Это смарт-контракт:
pragma solidity ^0.4.4;
contract Transfer {
address owner;
function Transfer () {
owner = msg.sender;
}
function sendEther (address dst) payable {
if(msg.value<=0) revert();
dst.transfer(msg.value);
}
}
Я пытаюсь получить доступ к функции sendEther из Интернета, используя javascript. Когда я обращался к своей тестовой сети локально, все работало нормально, но теперь я не могу к ней подключиться.
Сценарий преобразуется с помощью браузера, а затем включается в файл htm как простой тег сценария.
Сценарий выглядит следующим образом:
var Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
function getParameterByName(name, url) {
/* irrelevant code here */
}
try
{
// I have to define "source" this way because web3.eth.accounts[0] is undefined, most likely because there's no connection :(
var source = "0x8691202f56859bd5362f1033fa64e71cb4eae579";
var abi = [{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}];
var contract_addr = getParameterByName("contract");
var amount = getParameterByName("amount");
var destination = getParameterByName("destination");
var contract = new web3.eth.Contract(abi, contract_addr, {from: source, to: destination, value: parseInt(amount)});
var hash = contract.methods.sendEther(destinatario);
document.write("<br/> Source: ");
document.write(source);
document.write("<br/> Destination: ");
document.write(destination);
document.write("<br/><br/><b>ABI:</b> ");
document.write(JSON.stringify(abi));
document.write("<br/><br/><b>Contract:</b> ");
document.write(JSON.stringify(contract));
document.write("<br/><br/><b>Contract address:</b> ");
document.write(contract_addr);
document.write("<br/><br/><b>Amount (weis):</b> ");
document.write(amount);
document.write("<br/><br/><b>Transaction hash:</b> ");
document.write(JSON.stringify(hash));
document.write("<br/><br/><b>Transaction details:</b> ");
document.write(JSON.stringify(web3.eth.getTransaction(hash)));
} catch (e) {
document.write("<br/></br><b>Error: ");
document.write(e.message);
document.write("</b>");
}
Это результат, который я получаю:
Source: 0x8691202f56859bd5362f1033fa64e71cb4eae579
Destination: 0x09b74dc58118140deec480d562651e42ae3b21ad
ABI: [{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},{"inputs":[],"payable":false,"type":"constructor"}]
Contract: {"currentProvider":{"host":"http://localhost:8545","timeout":0,"connected":false},"_requestManager":{"provider":{"host":"http://localhost:8545","timeout":0,"connected":false},"providers":{},"subscriptions":{}},"givenProvider":null,"providers":{},"_provider":{"host":"http://localhost:8545","timeout":0,"connected":false},"_ethereumCall":{},"options":{"from":"0x8691202F56859BD5362f1033FA64E71cb4EaE579","to":"0x09b74dc58118140deec480d562651e42ae3b21ad","value":1000000000000,"address":"0x377D5848c8A7B68D20CcE114f23AD959a62CC9f7","jsonInterface":[{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},{"inputs":[],"payable":false,"type":"constructor"}]},"defaultAccount":null,"defaultBlock":"latest","methods":{},"events":{},"_address":"0x377D5848c8A7B68D20CcE114f23AD959a62CC9f7","_jsonInterface":[{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},{"inputs":[],"payable":false,"type":"constructor"}]}
Contract address: 0x377d5848c8a7b68d20cce114f23ad959a62cc9f7
Amount (weis): 1000000000000
Transaction hash: {"arguments":["0x09b74dc58118140deec480d562651e42ae3b21ad"],"_method":{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},"_parent":{"currentProvider":{"host":"http://localhost:8545","timeout":0,"connected":false},"_requestManager":{"provider":{"host":"http://localhost:8545","timeout":0,"connected":false},"providers":{},"subscriptions":{}},"givenProvider":null,"providers":{},"_provider":{"host":"http://localhost:8545","timeout":0,"connected":false},"_ethereumCall":{},"options":{"from":"0x8691202F56859BD5362f1033FA64E71cb4EaE579","to":"0x09b74dc58118140deec480d562651e42ae3b21ad","value":1000000000000,"address":"0x377D5848c8A7B68D20CcE114f23AD959a62CC9f7","jsonInterface":[{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},{"inputs":[],"payable":false,"type":"constructor"}]},"defaultAccount":null,"defaultBlock":"latest","methods":{},"events":{},"_address":"0x377D5848c8A7B68D20CcE114f23AD959a62CC9f7","_jsonInterface":[{"constant":false,"inputs":[{"name":"dst","type":"address"}],"name":"sendEther","outputs":[],"payable":true,"type":"function","signature":"0x48c981e2"},{"inputs":[],"payable":false,"type":"constructor"}]}}
Transaction details: {"isFulfilled":false,"isRejected":false}
И в этом проблема... Когда я взаимодействую с консолью трюфеля, все работает нормально. Когда я пытаюсь сделать то же самое через Интернет, он не подключается.
Любые идеи о том, что здесь происходит?
Огромное спасибо заранее! :)
Хорошо, я нашел ответ. Оставлю здесь, может кому пригодится...
Я не знал о truffle serve
, и когда я попытался его использовать, это вызвало ошибку.
Эту ошибку можно решить, следуя инструкциям, указанным здесь: https://github.com/trufflesuite/truffle/issues/448 .
Наконец-то я вижу свой testrpc в браузере! :)