Мне трудно понять документацию по вызову внешней функции из одного контракта в другой. В этом уроке есть пример:
contract InfoFeed {
function info() returns (uint ret) { return 42; }
}
contract Consumer {
InfoFeed feed;
function setFeed(address addr) { feed = InfoFeed(addr); }
function callFeed() { feed.info.value(10).gas(800)(); }
}
Который работает, когда я запускаю его из тумана.
Я пытаюсь написать этот контракт:
contract Auditor is owned {
growId public grower_IDs;
mapping (address => bool) public approvedGrows;
function Auditor(address GID){
grower_IDs = growId(GID);
grower_IDs.transferOwenership(this);
}
function approveGrower(address target){
if (approvedGrows[target] == true) throw;
else approvedGrows[target] = true;
}
function issueGrowerID(address target) {
if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
grower_IDs.makeID.value(10).gas(1000)(target);
}
else throw;
}
}
После того, как вы передадите право собственности (полный исходный код указан внизу) контракта Groer_ID Аудитору, вы сможете утвердить адрес, но я получаю ошибку «Слишком низкий внутренний газ», если я пытаюсь выпустить токен ID. Проблема в этой строке grower_IDs.makeID.value(10).gas(1000)(target);
, которая имеет ту же форму, что и пример feed.info.value(10).gas(800)();
, который не вызывает ошибку. Я не очень понимаю, для чего предназначен .value() при выполнении этого вызова. Есть ли способ запустить его с неопределенным количеством газа?
Полный источник:
contract owned {
address public owner;
bool disabled;
function owned() {
owner = msg.sender;
disabled = false;
}
modifier onlyOwner {
if (msg.sender != owner) throw;
}
modifier disableable {
if (disabled == true) throw;
}
function trasferOwnership(address newOwner) onlyOwner {
owner = newOwner;
}
event DisabledToggle(bool dis);
function disable() onlyOwner {
disabled = true;
DisabledToggle(true);
}
function enable() onlyOwner {
disabled = false;
DisabledToggle(false);
}
}
contract growId is owned {
string public name;
string public symbol;
uint8 public decimals;
mapping (address => uint256) public balanceOf;
function growId() {
name = "growId";
symbol = "GID";
decimals = 1;
}
function isOwner() returns (bool ret) {
if (msg.sender == owner) return true;
}
function makeID(address target) onlyOwner {
balanceOf[target] += 1;
Transfer(0, target, 1);
}
function transfer(address _to) disableable {
if (balanceOf[msg.sender] < 1 || balanceOf[_to] + 1 < balanceOf[_to])
throw;
if(msg.sender == owner){
balanceOf[msg.sender] -= 1;
balanceOf[_to] += 1;
Transfer(msg.sender, _to, 1);
}
if(_to == owner){
balanceOf[msg.sender] -= 1;
balanceOf[_to] += 1;
Transfer(msg.sender, _to, 1);
}
else throw;
}
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract Auditor is owned {
growId public grower_IDs;
mapping (address => bool) public approvedGrows;
function Auditor(address GID){
grower_IDs = growId(GID);
grower_IDs.transferOwenership(this);
}
function approveGrower(address target){
if (approvedGrows[target] == true) throw;
else approvedGrows[target] = true;
}
function issueGrowerID(address target) {
if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
grower_IDs.makeID.value(10).gas(1000)(target);
}
else throw;
}
}
Редактировать:
Процедура, которую я пробовал, заключается в том, чтобы сначала заключить контракт с GrowId, а затем аудитор использует адрес GrowId. После того, как я передаю право собственности на контракт с GrowId на адрес Аудитора, я добавляю одну из своих учетных записей в качестве утвержденного производителя. Ошибка возникает, когда я пытаюсь использовать функцию аудитора issueGrowerID
. Эта функция вызывает функцию GrowerID grower_IDs.makeID(target)
. Я пробовал это с обоими , grower_IDs.makeID(target)
и grower_IDs.value(x).gas(x)(target)
он все еще говорит, что собственный газ слишком низок.
Кошелек тумана пытается оценить соответствующее количество газа для отправки с транзакцией, но не всегда может оценить это точно или правильно.
На экране отправки транзакции в туманном кошельке gas
значение можно отредактировать. Увеличение его до чего-то большого (например, 2 миллиона) должно решить вашу проблему.
эт
.value()
это когда вы хотите перевести вэй: я не думаю, что Аудитор хочет платить 10 вэй каждый раз, когда он звонитmakeID
. Попробуйте удалить.gas()
, так как это ограничивает количество доступного газа,makeID
и эта соответствующая информация может помочь: ethereum.stackexchange.com/questions/551/…Анандамид