Не удается получить доступ к смарт-контракту, опубликованному с помощью трюфеля в testrpc из javascript

Я пытаюсь разработать простой смарт-контракт, который отправляет эфир с одного адреса на другой, и я не могу заставить его работать.

Я использую Ubuntu 16.04, truffle 3.4.7, node 7.10.1 и Solidity 0.4.13.

Контракт компилируется и публикуется в локальном testrpc, но когда я пытаюсь получить к нему доступ, он просто не работает.

Я искал решения везде, но я просто не могу понять, что не так, поэтому я надеюсь, что кто-нибудь здесь может мне помочь :)

Код смарт-контракта выглядит следующим образом:

contract Transfer {
    function Transfer () {
        owner = msg.sender;
    }
    function sendEther (address dst) payable {
        if(msg.value<=0) revert();
        dst.transfer(msg.value);
    }
}

Последовательность, которой я следую, чтобы развернуть ее, следующая:

  1. тестрпк
  2. компиляция трюфеля
  3. трюфель

Затем у меня есть простой файл html, который включает файл js, который должен выполнить передачу:

< script src="/usr/local/lib/node_modules/ethereum-console/node_modules/web3/dist/web3.min.js" >< /script >
< script src="test.js" >< /script >
< /head >
< body >
< /body >
< /html >

А вот содержимое файла test.js:

var Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
var account_one = web3.eth.accounts[0]; // testrpc address
var account_two = web3.eth.accounts[9]; // testrpc address
/*
// This works fine, makes the transfer:
web3.eth.sendTransaction({from: account_two, to: account_one, value: 100000000000});
*/
// These don't work:
try
{
// First try:
    obj = Transfer.deployed();
    obj.sendEther(account_two, {from: account_one, to: objTransfer, value: 100000000000});
// Second try:
    Transfer.deployed().then(
        function(instance) {
            obj = instance;
            return obj.sendEther.call(account_two, {from: account_one, to: objTransfer, value: 100000000000});
        }
    );
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}

Конечно, первая и вторая попытки - это две вещи, которые я пробовал, не выполняя обе одновременно, при попытке одной из них другая комментируется.

В любом случае, вывод, который я получаю, когда отображаю html-файл в браузере:

Ошибка: передача не определена

Очевидно, что смарт-контракт Transfer не может быть создан, но я просто не понимаю, почему. Любая помощь в том, как я могу сделать эту работу?

Огромное спасибо заранее! :)

Ответы (1)

Вам нужно создать экземпляр контракта в файле javascript, используя его ABI и адрес, по которому он развернут, как показано ниже [замените ABI и адрес вашего контракта]:

// Try to use as below
try {
    // First try:
    var abi = <your contract ABI>;
    var Contract = web3.eth.contract(abi);
    var contractInstance = Contract.at('<Your contract address>');
    contractInstance.sendTransaction({from: account_two, to: account_one, value: 100000000000});
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}
Большое спасибо! Я собираюсь попробовать это прямо сейчас, чтобы увидеть, работает ли это :) Нет ли более... "элегантного" решения для этого? Я имею в виду, действительно ли необходимо добавлять весь ABI в файл js?
Хорошо... у меня тоже не работает :( Выдает эту ошибку: t.abi.filter не является функцией
ваш ABI должен быть массивом javascript вместо строки. Попробуйте JSON.stringify('<ABI>'). ABI будет общедоступным при развертывании контракта, поэтому вы можете сохранить его в javascript или сохранить на сервере и получить через вызов ajax. Все зависит от тебя. :)
Вау... наконец-то сработало!!! Не могу отблагодарить вас достаточно!! :)
Наконец-то я набрал достаточно репутации, чтобы проголосовать за ваш ответ!!! :)