Bitcoin Forum

Local => Альтернативные криптовалюты => Topic started by: zuart on July 22, 2018, 12:37:09 PM



Title: Работа с ETH и токенами ERC20
Post by: zuart on July 22, 2018, 12:37:09 PM
Приветствую сообщество.
Тут решили тотализатор небольшой накатать для токенов ETH/ERC20, уперлись в стенку - тупняк какой-то...
 

Суть задачи:
    вести один основной кошелек со всеми поступающими средствами
    пользователь при регистрации получает персональный адрес для токенов (приватные ключи фиксируются в БД, юзер их не получает)
    все, что юзеры переводят собирается на основном кошельке (балансы фиксируются в БД и все операции с балансом происходят в БД)
    вывод в случае необходимости выполняется с основного адреса


Пытаемся разобраться с принципами работы с нодой ETH через WEB3 и уперлись в пару моментов:
    насколько поняли суть сети, можно сделать перевод с адреса1 на адрес2, но так, чтобы "газ" снимать именно с адреса2
    с токенами ERC20 (не ETH) можно тоже делать так же, но через контракты, которыми токены и создавались
 

И вот тут полный затуп - как это сделать с помощью WEB3JS, крайне нужны работающие примеры кода для ETH и любого ERC20-токена, которые реализуют логику "перевод токенов с адреса-1 на адрес-2 и оплатой транзакции газом с адреса-2".

Будем крайне признательны за подсказку.


Title: Re: Работа с ETH и токенами ERC20
Post by: Snasey on July 23, 2018, 01:32:59 PM
На мой взгляд это одна из ключевых болей эфира, в связи с которой его не активно юзает реальный бизнес.
Сделать так, что бы комиссию в газе оплатил кошелек2, в то время как отправитель кошелек1 - нельзя. (совсем)

Я делал для заказчика довольно похожий проект, мы решали это костылем: при запросе перевода на сайте, бэкенд дергал web3 и переводил с админского кошелька эфир ровно на одну транзакцию на кошелек1, далее эта транзакция уже совершалась с данного кошелька.


Title: Re: Работа с ETH и токенами ERC20
Post by: zuart on July 24, 2018, 08:37:38 AM
На мой взгляд это одна из ключевых болей эфира, в связи с которой его не активно юзает реальный бизнес.
Сделать так, что бы комиссию в газе оплатил кошелек2, в то время как отправитель кошелек1 - нельзя. (совсем)

Я делал для заказчика довольно похожий проект, мы решали это костылем: при запросе перевода на сайте, бэкенд дергал web3 и переводил с админского кошелька эфир ровно на одну транзакцию на кошелек1, далее эта транзакция уже совершалась с данного кошелька.

Вот как =( видимо, мы не верно поняли возможности сети. Жаль, я бы даже сказал очень, т.к. если для перевода токенов с пользовательского кошелька на основной нужно сначала на это пользовательский кошелек перекидывать eth для оплаты газа - не очень радостная перспектива.

Можете тогда пнуть хотя бы в рабочий пример перевода ETH с одного аккаунта на другой, ибо те, что мы пробовали, ни один не сработал через WEB3 JS


Title: Re: Работа с ETH и токенами ERC20
Post by: zuart on July 24, 2018, 01:55:07 PM
Попытались несколькими способами реализовать перевод ETH - все безуспешно, все способы, которые пробовали, возвращают хеш транзакции, но дальше дело не идет, в сеть транза не выходит, баланс не меняется. Единственный способ, который хоть что-то еще выдает, публикую ниже с подробными вставками данных отладки:

Code:
var desc = '0xed32e0fd016810B7d3606e1Ae163B58266c544B0';
var from = '0x6938298963357122F72592ADD77109767c7d67F0';
var key = '9cb.............2a84';
var val = '0.01';

var tx = {
to: desc,
from: from,
gasLimit: 200000,
nonce: wsp.now(), // микротайм
value: w3.utils.toWei(val, 'ether'),
data: '0x00'
};

// tx Object {
// data "0x00"
// from "0x6938298963357122F72592ADD77109767c7d67F0"
// gasLimit 200000
// gasPrice 2200000000
// nonce 1532438682638
// to "0xed32e0fd016810B7d3606e1Ae163B58266c544B0"
// value "10000000000000000"
// }


w3.eth.getBalance(tx.from).then((balance) => {
logger.log('Balance: ', balance);
});

// balance "79000000000000000"


w3.eth.accounts.signTransaction(tx, key).then((hash) => {

// tx Object {
// chainId "0x1"
// data "0x00"
// from "0x6938298963357122f72592add77109767c7d67f0"
// gas "0x30d40"
// gasLimit 200000
// gasPrice "0xa3e9ab80"
// nonce "0x164cc7fb39b"
// to "0xed32e0fd016810b7d3606e1ae163b58266c544b0"
// value "0x2386f26fc10000"
// }
// hash Object {
// messageHash "0x5d113c4a6...44d8efb8aacb90"
// r "0x97adcecb7...ed3b55b7b0f216"
// rawTransaction "0xf87186016...de14043fc15934"
// s "0x7e501c806...de14043fc15934"
// v "0x26"
// }


return w3.eth.sendSignedTransaction(hash.rawTransaction).then((receipt) => {
return receipt;
}, (error) => {
// Error: Returned error: insufficient funds for gas * price + value

console.log(error);
return error;
});
}, (error) => {
console.log(error);
return error;
});

Абсолютно непонятно, с чего такая ошибка, тут банальная математика:

Code:
10000000000000000 - вывод
  440000000000000 = 200000 * 2200000000 - лимит * прайс
-----------------

79000000000000000 - баланс
10440000000000000 - всего нужно
-----------------

68560000000000000 - остаток