Как перечислить транзакции с адреса счета?

У меня есть небольшой сервис, где люди могут обменивать криптовалюты. У каждого пользователя есть свой биткойн, лайткойн и т. д. адрес для пополнения баланса. Теперь я хочу добавить Ethereum. Поэтому я подумал, что создам учетную запись для каждого пользователя, а затем проверю входящие транзакции. Но, как я понял, я не могу получить список транзакций с адреса аккаунта. Это странно. Даже в кошельке Mist я не вижу, откуда берется эфир. Единственный способ получить транзакции — это проверить какой-нибудь сторонний обозреватель блокчейнов.

Также, как я понял, правильным способом будет создание смарт-контракта, потому что у него есть необходимый API. Но я не могу создать контакт для каждого пользователя.

Может быть, мне нужно создать только 1 контракт, который будет «перенаправлять» эфир на мой основной счет, но это не очень удобно, потому что пользователю будет предложено добавить некоторые дополнительные данные в транзакцию, чтобы я мог понять, кто есть кто.

Любой совет будет полезен.

Я советую проголосовать за #1897 на github.
@NikhilM, готово.
ethereum.stackexchange.com/questions/3417/… также полезен для понимания.
Эта тема также может быть полезна: ethereum.stackexchange.com/questions/2531/…
Извините, я не могу комментировать, поэтому я спрошу здесь. @dmxhZGp1c2hh ты нашел решение? Если да, пожалуйста, опубликуйте это здесь.
выпуск №1897 не активен около года
@PavelNiedoba Активности нет, потому что проблема закрыта. Неизвестно, будет ли он когда-либо реализован (и, судя по этому потоку, это маловероятно).
Я уверен, что это нужно многим. Я готов оплатить часть этого. Есть ли где-нибудь работа для эфирного сообщества?

Ответы (3)

Если я правильно понял ваш вопрос, вы хотите видеть, кто депонировал Eth на адрес вашего контракта. Для этого и нужны журналы событий.

(1) Создайте контракт, в котором событие происходит каждый раз, когда происходит транзакция. например что-то вроде:

contract someContract {   

    address public owner;

    // Set the owner of the contract to be the creator of the contract i.e. you
    function someContract() {
        owner = msg.sender;
    } 

    // This is an event 
    event DepositMade(address _from, uint value);
    event WithdrawalMade(address _to, uint value);

    //Catch all function 
    function() {
        // generate an event when someone sends you Eth
        if (msg.value > 0)
            DepositMade(msg.sender, msg.value);
    }

    // Only the owner of the site can withdraw Eth
    modifier admin { if (msg.sender == owner) _ }

    function withdraw(uint amount, address recipient) admin {
        if(recipient.send(amount))
            WithdrawalMade(msg.sender, msg.value);
        else throw;
    }
}

Важными битами являются определение типа события event DepositMade(address _from, uint value)и создание события, когда что-то происходит DepositMade(msg.sender, msg.value);. Эти события сохраняются в журнале событий, связанном с адресом развернутого экземпляра контракта.

(2) Вы получаете события по этому контракту, используя rpc eth_newFilterили web3.eth.filter, например, что-то вроде:

var filter = web3.eth.filter({fromBlock:0, toBlock: 'latest', address: contractAddress, 'topics':['0x' + web3.sha3('DepositMade(hexstring,uint256)')]});
filter.watch(function(error, result) {
   if(!error) console.log(result);
})
Спасибо, но я спрашиваю об обычном аккаунте, а не о контракте.
пользователю не нужно знать разницу. Никаких данных не требуется, они просто отправляют Eth на адрес, и функция перехвата всех () запускается
Итак, если у меня 1000 пользователей, мне нужно создать 1000 контрактов?
Нет. Вы развертываете вышеуказанный контракт. Они отправляют Eth на адрес этого экземпляра контракта и отправляют суммы, а адреса всех отправителей регистрируются.
ХОРОШО. Я получаю адрес отправителя и как мне связать его с моими пользователями? Все мои пользователи будут отправлять эфир на 1 адрес и как мне узнать кто есть кто?
Это зависит от вас. Возможно, они могли бы сообщить вам адрес своей учетной записи при регистрации.
Или я могу попросить добавить дополнительные данные в транзакцию. Оба способа не элегантны с точки зрения UX.
Это хороший фрагмент кода, но зачем тратить впустую информацию о регистрации eth, уже зарегистрированную в блокчейне?
@JackWinters Сопоставлять адреса с пользователями на самом деле непросто, и это может быть потенциальной угрозой безопасности.
@AlexCoventry Есть какие-нибудь указания, как сделать именно это? Примеры кода/варианты использования кажутся скудными.
@EvilJordan, попробуйте ethereum.stackexchange.com/a/3478/9841
Это не очень хорошо для бизнес-решения. Мы говорим о реальных деньгах, поэтому они должны быть надежными. Клиенты, делающие депозиты с бирж, не знают, с какого адреса отправляются транзакции, несколько клиентов могут использовать один и тот же адрес. Кошельки не имеют возможности включать произвольные данные. Должен быть сгенерирован адрес для каждого клиента, а затем средства должны быть перенаправлены на общий счет. Поэтому нам нужен список входящих (и исходящих - которые у нас есть) транзакций.
в коде есть ошибка, так и должно быть WithdrawalMade(recipient, amount);, не так ли?
Это стоит газа?

Вы можете попробовать использовать API GetAccountTransactions etherchain.org, который задокументирован по адресу https://etherchain.org/documentation/api/ .

Например: https://etherchain.org/api/account/0xbeef281b81d383336aca8b2b067a526227638087/tx/0 предоставит вам транзакции, как показано на https://etherchain.org/account/0xbeef281b81d383336aca8b2b067a526227638087#txsent

У Etherscan также есть несколько задокументированных API — https://etherscan.io/apis . Вот эквивалентный вызов API для тех же данных транзакции для учетной записи, что и выше. http://api.etherscan.io/api?module=account&action=txlist&address=0xbeef281b81d383336aca8b2b067a526227638087&sort=asc

Я думаю, что dmxhZGp1c2hh не хочет использовать сторонний сервис
Etherchain.org часто находится в «режиме ограниченных возможностей» и ненадежен. Etherscan.io имеет ограничение API 5 в секунду без возможности увеличения. Это ужасно и на грани бесполезности. Не следует доверять эту информацию третьим лицам, какими бы заслуживающими доверия они ни казались. Кроме того, ни один из них не показывает передачу токенов, что кажется совершенно другим зверем.
@EvilJordan Я согласен, даже если сейчас это работает нормально, я не хочу, чтобы мой бизнес зависел от этого. Я допустил эту ошибку с btc blockchain.info, у которого раньше было много проблем, когда btc становился популярным.

Ethplorer предоставляет хороший API для многих случаев.

Получить информацию об адресе

Получить историю адресов

и многие другие.введите описание изображения здесь