Допустим, у меня есть децентрализованное приложение, которое позволяет людям покупать какой-то объект по произвольной цене.
Пользователь 1 покупает объект за 1 eth. Через несколько мгновений пользователь 2 покупает тот же товар. Как я могу отслеживать это событие и автоматически возвращать соответствующее количество эфириума пользователю 2? Вот что у меня есть до сих пор:
contract Adoption {
address[16] public adopters;
function returnEth() public payable {
msg.sender.transfer(msg.value);
}
// Adopting a pet
function adopt(uint petId) public payable returns (uint) {
require(petId >= 0 && petId <= 15);
//require(msg.value == 1 ether);
adopters[petId] = msg.sender;
returnEth();
return petId;
//return value;
}
// Retrieving the adopters
function getAdopters() public view returns (address[16]) {
return adopters;
}
}
Читая между строк, я думаю, вы говорите, что пользователю 2 не должно быть разрешено покупать товар, который уже купил пользователь 1.
Если это так, то звонок, сделанный пользователем 2 для покупки предмета, должен завершиться ошибкой. Вы не поделились функцией, которая используется для совершения покупки, но она должна отменить транзакцию, если товар уже продан.
<address>.transfer(<amount>)
.returnEth();
. Если ваш вопрос: «Как мне вызвать функцию из web3.js?» это не кажется связанным. Пожалуйста, задайте его как новый вопрос, но сначала просто прочитайте учебник, может быть, даже мой: programtheblockchain.com/posts/2017/12/13/… . (Я думаю, однако, что, может быть, вы используете Truffle? Если да, посмотрите вместо этого учебник.)returnEth()
никогда не должен уменьшать количество эфира на счету вызывающего абонента. Даже если это transfer
не удастся, транзакция будет отменена, поэтому эфир не будет двигаться.adopt
этого вызывает returnEth
.)adopt()
, после звонка я получу> 99,99999999 эфиров.
пользователь19510