Я написал солидный контракт, в котором можно поделиться хэшем файла вместе с учетными записями, которые могут иметь доступ к хэшу файла. Что-то вроде обмена файлами. Просто базовый контракт, учетные записи, имеющие контроль доступа, могут получить хэш файла, а остальные не могут (они получают сообщение об ошибке).
Сначала я тестирую его на ремиксе, и он работает абсолютно нормально. Но как только он развернут в моей частной сети Эфириума, blockCount
переменная не увеличивается. Поэтому, когда я вызываю функцию getFileHash
, она возвращает «ошибку».
Код контракта:
pragma solidity ^0.4.0;
contract hcare
{
struct block
{
string fileHash;
uint numRecv;
address[] recvAddress;
}
uint i;
uint recvCount;
//uint8 public blockCount;
address owner;
block temp;
//a single block
block[] Blocks; //array of blocks
event fileUploaded (address sender , uint cnt);
function hcare()
{
owner = msg.sender;
}
function addBlock (string fHash, address[] recvAddr) public
{
//temp = block(fHash , recvAddr.length , recvAddr);
Blocks.push(block(fHash , recvAddr.length , recvAddr));
fileUploaded (msg.sender, Blocks.length);
}
function getBlockCount() public constant returns (uint)
{
return Blocks.length;
}
function getFileHash () public constant returns(string)
{
string tempFHash;
uint ctr=0;
uint i;
uint j;
for (i=0; i < Blocks.length;i++)
{
for ( j=0; j<Blocks[i].recvAddress.length;j++)
{
if (Blocks[i].recvAddress[j] == msg.sender)
{
tempFHash = Blocks[i].fileHash;
ctr = 1;
// if (ctr == 1)
// break;
}
}
}
if(ctr == 1)
return tempFHash;
else
return "error";
}
}
Edit1: заменена переменная blockCount, возвращая Blocks.length , но длина блока по-прежнему возвращает ноль. Насколько я понимаю, в массив структур ничего не добавляется.
Edit2: Загрузил уточненную версию кода в PasteBin . Основная проблема с тем, что блок не добавляется в структуру, сохраняется.
Вы используете blockCount
для подсчета количества элементов в массиве Blocks
и обеих переменных blockCount
и Blocks
являются глобальными. Вместо использования blockCount
для подсчета размера массива вы должны использовать определенную функцию length
для получения размера массива Blocks
. Поэтому, пожалуйста, удалите blockCount
и используйте Block.length
на своем месте.
Исмаэль
addBlock
это удалось и не выдало исключение из газа? Операции со строками дороги и могут потерпеть неудачу, если им не хватило газа.Аргья Датта
addBlock
при выполнении вернула хеш транзакции, так что я почти уверен, что не было исключения из газа. Кроме того, я попытался заменить лимит газа по умолчанию «3000000» в Remix на лимит газа «0x8000000», и он все еще работает в Remix.Тьяден Хесс
eth.getTransactionReceipt
и проверив, соответствует лиgasUsed
поле отправленному газу. Обратите внимание, что если это так, это подразумевает некоторое исключение, не обязательно OOG.