Я написал простой контракт токена для целей тестирования:
pragma solidity ^0.4.18;
contract TestToken {
uint public totalSupply;
mapping(address => uint) public balanceOf;
function transfer(address to, uint amount) public returns (bool) {
require(balanceOf[msg.sender] >= amount);
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
return true;
}
function credit(address to, uint amount) public {
balanceOf[to] += amount;
totalSupply += amount;
}
function debit(address from, uint amount) public {
balanceOf[from] -= amount;
totalSupply -= amount;
}
}
Всякий раз, когда я вызываю credit
метод для контракта и передаю адрес другого контракта в качестве параметра, все работает так, как ожидалось:
token.methods.credit(wallet._address, 500000).send({from: accounts[0], gas: "0xB3E4", gasPrice: "0x4A817C800", value: "0x"})
Статус сделки такой 0x1
.
Баланс обновляется:
token.methods.balanceOf(wallet._address).call()
'500000'
Но когда я передаю в качестве параметра адрес обычной учетной записи ethereum, транзакция майнится, но ничего не происходит.
token.methods.credit(accounts[0], 500000).send({from: accounts[0], gas: "0xB3E4", gasPrice: "0x4A817C800", value: "0x"})
Статус сделки такой 0x0
.
Баланс не меняется:
token.methods.balanceOf(accounts[0]).call()
'0'
При сравнении результирующих объектов подписанных транзакций единственное различие, кроме поля, data
заключается в том, что значение подписи v
всегда 0
при сбое транзакции и 1
при успешном выполнении транзакции. Но я не уверен, что это значит.
Обновлять:
Похоже, это даже не контракт против неконтракта, просто некоторые адреса не работают.
Например, это работает:
token.methods.credit('0xd2d0aD819B2679FBDD5C75F93fa13242bfd7E2A5', 500000000000000000).send({from: accounts[0], gas: "0xB3E4", gasPrice: "0x4A817C800", value: "0x"})
Это не:
token.methods.credit('0xc4beccd2ebdb32203800dfbc60ff0dd7c2762b48', 500000000000000000).send({from: accounts[0], gas: "0xB3E4", gasPrice: "0x4A817C800", value: "0x"})
Проблема скорее всего в лимите газа. Как вы его рассчитали?
Когда к транзакции присоединены некоторые данные, например, селектор метода контракта и параметры, нулевые байты стоят меньше, чем ненулевые. Таким образом, транзакция, которая отправляет токены, 0x0011223344556677889900112233445566778899
будет стоить меньше, чем транзакция, которая отправляет такое же количество токенов на 0x112233445566778899aa112233445566778899aa
. Кроме того, изменение значения в хранилище с нуля на ненулевое стоит дороже, чем изменение его с ненулевого на ненулевое. Так что balanceOf[to] += amount;
стоит меньше, если to
в адресе уже есть токены.
credit
функции, которая чеканит новые токены.
Исмаэль
Dcompoze