Я создал контракт, в котором хранятся адреса пользователей, и я хочу отправить 1 эфир всем пользователям, хранящимся в массиве.
Вот мой код
contract project{
address public user;
bytes32[10] name;
address[10] customer;
uint public i=0;
function project(){
user=msg.sender;
}
function add(bytes32 _name){
name[i]=_name;
customer[i]=msg.sender;
i++;
}
function get_address() constant returns(address[10]){
return customer;
}
function reward() {
for(uint i=0;i<10;i++)
{
customer[i].send(1);
}
}
}
Когда я вызываю метамаску вознаграждения метода, выполняется транзакция, но эфир не передается.
Пожалуйста, помогите мне.
Вы пытаетесь заставить контракт отправить средства, которых у него нет. Для этого нужен эфир. Баланс будет начинаться с 0, поэтому вам нужно добавить function() payable{}
и отправить немного эфира для работы.
Я отметил часть кода *** unsafe ***
, чтобы избежать недоразумений. Есть более глубокие опасения по поводу обращения с деньгами таким образом. Хорошим следующим шагом будет проверка успеха/неудачи операции send()
, а затем ответная реакция по-другому. У меня он выдает сообщение об ошибке или сообщение об успехе.
Я добавил несколько эмиттеров событий, чтобы вы могли видеть, что происходит.
Надеюсь, поможет.
contract project{
address public user;
bytes32[10] name;
address[10] customer;
uint public i=0;
event LogDep (address sender, uint amount, uint balance);
event LogSent(address recipient, uint amount, uint balance);
event LogErr (address recipient, uint amount, uint balance);
function project(){
user=msg.sender;
}
function depositFunds() public payable returns(bool success) {
LogDep(msg.sender, msg.value, this.balance);
return true;
}
function add(bytes32 _name){
name[i]=_name;
customer[i]=msg.sender;
i++;
}
function get_address() constant returns(address[10]){
return customer;
}
function reward() {
for(uint i=0;i<10;i++)
{
// *** unsafe pattern ***
if(customer[i].send(1)) {
LogSent(customer[i], 1, this.balance);
} else {
LogErr(customer[i], 1, this.balance);
}
}
}
}
Вот он в ремиксе, чтобы показать, как он работает.
Если вы еще не видели Remix, перейдите сюда https://ethereum.github.io/browser-solidity и просто вставьте код в компилятор. Вы можете взаимодействовать с контрактными функциями.
Шаг 1: Создайте контракт
Шаг 2: Отправьте контракту немного средств
10 вэй достаточно, чтобы отправить 1 всем 10 клиентам. Если вы отправите меньше, вы начнете видеть неудачные отправки на шаге 3.
Шаг 3: отправьте txn на вознаграждение()
Обязательно НЕ отправляйте wei/eth на этот раз, потому что эта функция не подлежит оплате.
Анураг Верма
Роб Хитченс
Роб Хитченс
Анураг Верма
Роб Хитченс
Роб Хитченс
Анураг Верма