Почему контракт не работает в тестовой сети, но работает в ремиксе

Я написал солидный контракт, в котором можно поделиться хэшем файла вместе с учетными записями, которые могут иметь доступ к хэшу файла. Что-то вроде обмена файлами. Просто базовый контракт, учетные записи, имеющие контроль доступа, могут получить хэш файла, а остальные не могут (они получают сообщение об ошибке).

Сначала я тестирую его на ремиксе, и он работает абсолютно нормально. Но как только он развернут в моей частной сети Эфириума, 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 . Основная проблема с тем, что блок не добавляется в структуру, сохраняется.

Можете ли вы проверить, что addBlockэто удалось и не выдало исключение из газа? Операции со строками дороги и могут потерпеть неудачу, если им не хватило газа.
Функция addBlockпри выполнении вернула хеш транзакции, так что я почти уверен, что не было исключения из газа. Кроме того, я попытался заменить лимит газа по умолчанию «3000000» в Remix на лимит газа «0x8000000», и он все еще работает в Remix.
Возврат хэша tx не означает, что не было исключения из-за нехватки газа. Вы можете диагностировать проблему, запустив eth.getTransactionReceiptи проверив, соответствует ли gasUsedполе отправленному газу. Обратите внимание, что если это так, это подразумевает некоторое исключение, не обязательно OOG.

Ответы (1)

Вы используете blockCountдля подсчета количества элементов в массиве Blocksи обеих переменных blockCountи Blocksявляются глобальными. Вместо использования blockCountдля подсчета размера массива вы должны использовать определенную функцию lengthдля получения размера массива Blocks. Поэтому, пожалуйста, удалите blockCountи используйте Block.lengthна своем месте.

Я попробовал этот вариант, и результат все тот же. Выполняется правильно на Remix, но не в консоли. Есть ли способ узнать, действительно ли что-то добавляется к блокам, кроме попытки использовать Blocks.length (который не работает)?
@ArghyaDutta круто! поэтому, пожалуйста, обновите рассматриваемый код. Не забудьте добавить примечание об обновлении.