Web3JS Ethereum (ошибка в коде при передаче данных)

Кто работает с этой библиотекой для разработки DApp под Ethereum (Blockchain) подскажите, пожалуйста.
Есть тестовая вебстраничка https://jsfiddle.net/LenaR/m3chqnmt/1/
которая передает криптовалюту в количестве 0.1ether (количество указано в переменной на 10 строке в этом примере) из своего кошелька (который также указан строковой переменной в коде на 4 строке). Кошелек, на который надо перевести вносится пользователем в поле input.
При переводе (Send Transaction) выдает ошибку.
http://i.piccy.info/i9/83aa4da88d511deef2138981a66f8846/1509892815/86229/1193847/ex1.jpg
Ошибка в том, что значение из инпута передает пустую строку, а не то, которое ввел пользователь. Оно не передает значение из этой переменной var receiverAccount = web3.toHex(recac.value); в объект const rawTx , и поэтому to: receiverAccount (25 строка кода) всегда 0. В консоли браузера этот ноль хеширован как 0х0.
Как передать value инпута в этот объект?

Код работает под МетаМаск (плагин браузера) с локальной страницы, в JSFiddle не знаю сработает ли.
Вопрос задавала также на https://ethereum.stackexchange.com, пока не отвечают.

Как ты думаешь какое значение в инпуте когда выполняется эта строка кода? var receiverAccount = web3.toHex(recac.value);?

Забирай значение из инпута recac пользователя в коллбеке когда пользователь нажимает кнопку.

Как? В функцию sendTransaction передать эту переменную? пример https://jsfiddle.net/m3chqnmt/2/
Но так тоже не работает, тогда в консоли выдает undefined. Оно сначала в объект передает, и уже потом в функцию отправки, и я этот момент не понимаю как оно должно работать

https://jsfiddle.net/m3chqnmt/3/ пример в чистом виде (без дополнительной логики). Первый алерт показывает значение инпута когда страница только загрузилась. Это пустая строка. Заполни инпут, кники по кнопке, увидешь второй алерт, который выполнится когда в инпуте уже есть значение. Из вышеописанного пойми когда надо забирать значение из инпута в твоем коде.

В случае с алертом оно работает.
Если навешивать обработчик клика на передачу этого web3.eth.sendRawTransaction("0x" + serializedTx.toString('hex'), - пример https://jsfiddle.net/m3chqnmt/4/
Срабатывает только алерт, а передача данных выдает ошибку в консоли уже так - http://i.piccy.info/i9/d2798e21c65fddea55ce9b6dc053bd97/1509993825/120057/1194250/ex2.jpg
http://i.piccy.info/i9/27cb86ae2d7e5ef67ce169cd4bb822b6/1509994072/172480/1194250/ex3.jpg

Как думаешь из-за чего?

false не там, скобкой ниже должно быть https://jsfiddle.net/m3chqnmt/5/
если ты это имеешь ввиду?
Но все равно ошибка та же, что и вначале была http://i.piccy.info/i9/83aa4da88d511deef2138981a66f8846/1509892815/86229/1193847/ex1.jpg

Нет, вопрос про мой пример. https://jsfiddle.net/m3chqnmt/3/В моем примере, почему первый алерт пустой, а алерт по клике на кнопку - с текстом?

потому что при загрузке страницы инпут пустой, а при клике - заполненный.
Но в этом коде https://jsfiddle.net/m3chqnmt/5/ данные для передачи формируются этой строкой web3.eth.sendRawTransaction(“0x” + serializedTx.toString(‘hex’) - то есть она собирает всё то что получает объект const rawTx. В обход этого объекта нельзя что-то отдельно в функцию обработчика клика передать. Я так понимаю. Или ты имеешь ввиду - в самом объекте код править а не в функцию обработчика добавлять передачу данных из инпута?

Т.е. при загрузке страницы инпут пустой, во время клика в нем есть значение. Теперь о твоем примере - в какой момент времени (при загрузке или при клике на кнопку) записываются значения в объект rawTx?

Получается что при загрузке.
Навешивать обработчик с вызовом функции - прямо в этом объекте? - нельзя

    document.querySelector('button').addEventListener('click', function () {
    alert(recacc.value);
    receiverAccount = web3.toHex(recac.value);

А если в объекте записать присвоение to: receiverAccount = web3.toHex(recac.value), - так тоже не работает
Я не знаю как его передать в объект const rawTx

Сама формулировка не верна. Пересмотри то как ты думаешь про регистрирование обработчиков событий.

Как выглядит это “не работает”?


Ты можешь собрать все данные для запроса до нажатия кнопки. В момент нажатия кнопки скопировать приготовленные параметры в новый объект, и добавить в этот объект еще один параметр - значение инпута. https://jsfiddle.net/m3chqnmt/6/

так что только для alert этот код работает, а для передачи транзакции выдает ошибку самой библиотеки. Если бы не работала функция обработчика - тогда бы и алерт не сработал.

Разбила эту библиотеку по строкам, чтобы посмотреть где что в какой строке ошибки:


Возможно дело в самой библиотеке, а не в моем коде? Что библиотека не пропускает передачу данных из инпута?
(на скринах ошибки в строках кода из этой библиотеки)

Скажи, как ты видишь ситуацию: это новая ошибка, или та же с которой начиналась эта ветка обсуждений? И из чего ты исходишь в рассуждениях.

Любой библиотеке все равно откуда пришли данные. Ей главное получить ожидаемый набор параметров (считай ключей и значений).

Ты можешь это проверить. Напиши код, который бы доказал что дело в библиотеке.

если значение передать строкой а не с инпута:
var receiverAccount = '0x4d...1212'; - тогда работает (пересылает криптовалюту). Я не знаю где искать ошибку - если та же функция для алерта работет а для инпута - нет. И в консоли ошибок из моего файла нет, есть только ошибки этой библиотеки…

Покажи полный код двух вариантов (когда подставляешь значение из строки и когда из инпута).

https://jsfiddle.net/LenaR/057cnnq8/ - код примера, который работает
http://i.piccy.info/i9/c299f2c65d729f3304a141b141dc6359/1510166809/90913/1194788/ex7.jpg

https://jsfiddle.net/m3chqnmt/5/ - мой пример, в котором работает только алерт

В коде, который ты кинула нет принципиальных отличий от того кода, с которого мы начинали. И оба примера не имеют отличий в ключевых моментах.

Процесс наполнения объекта rawTx и создание трансзакции в обоих случаях происходит в один и тот же момент.

В моем примере эту моменту соответствует первый алерт. В тот момент времени значения инпута нет. У тебя создаутся объект rawTx. И отправляешь ты его через некоторое время внутри sendTransaction. Но объект уже создан, и значение из инпута ты не забираешь (в моем примере этому соответствует второй алерт, который показывает что значение в инпуте есть). Видна структурная похожесть моего кода и твоего?

Что делать? Создавать объект и трансзакцию тогда когда данные в инпуте уже есть:

а как его забирать?

        const rawTx = {
          nonce: nonceHex,
          gasPrice: gasPriceHex,
          gasLimit: gasLimit,
                   to: receiverAccount = web3.toHex(recac.value), 
...

так не работает

В твоем комментарии неожиданное для меня выражение: в свойство to записывается результат выражения receiverAccount = web3.toHex(recac.value). Это то что ты хочешь сделать? Во что вычисляется это выражение?

И что значит “не работает”? Описывай как выглядит результат неработы (ошибка в консоли, не запускается код, ошибка ответа от сервера итд), без этого тебе не смогут помочь.