У меня есть небольшой сервис, где люди могут обменивать криптовалюты. У каждого пользователя есть свой биткойн, лайткойн и т. д. адрес для пополнения баланса. Теперь я хочу добавить Ethereum. Поэтому я подумал, что создам учетную запись для каждого пользователя, а затем проверю входящие транзакции. Но, как я понял, я не могу получить список транзакций с адреса аккаунта. Это странно. Даже в кошельке Mist я не вижу, откуда берется эфир. Единственный способ получить транзакции — это проверить какой-нибудь сторонний обозреватель блокчейнов.
Также, как я понял, правильным способом будет создание смарт-контракта, потому что у него есть необходимый API. Но я не могу создать контакт для каждого пользователя.
Может быть, мне нужно создать только 1 контракт, который будет «перенаправлять» эфир на мой основной счет, но это не очень удобно, потому что пользователю будет предложено добавить некоторые дополнительные данные в транзакцию, чтобы я мог понять, кто есть кто.
Любой совет будет полезен.
Если я правильно понял ваш вопрос, вы хотите видеть, кто депонировал 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);
})
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
эт
Джефф
понял00d
Павел Недоба
Злой Джордан
Павел Недоба