Массовые операции - PullRequest
       13

Массовые операции

0 голосов
/ 20 апреля 2020

В корпоративной частной сети мне нужно защищать терабайты информации в процессе сбора данных аудита. Для этого мне нужно было бы отправить большую часть данных в одном запросе, и для этого у меня есть эта функция в контракте:

struct Entity {
    bytes hash;
    bool saved;
}

struct DTO{
    string id;
    bytes hash;
}
mapping (string => Entity) public Entities;

event EntitySaved(string id, bytes hash);

function SaveEntity(string memory id, bytes memory hash) public {
    require(DataProviders[msg.sender]);
    Entity storage entity = Entities[id];
    require(!entity.saved, 'The entity has already been saved');
    entity.hash = hash;
    entity.saved = true;
    emit EntitySaved(id, hash);
}

function SaveEntities(DTO[] memory _dtos) public {
   for (uint i = 0; i < _dtos.length; i++) {
       SaveEntity(_dtos[i].id, _dtos[i].hash);
   }
}

Я использую n ethereum для отправки данных в контракт, и у меня проблемы с этим. Эта функция не выдает никаких ошибок, но данные не сохраняются в цепочке блоков:

DTO[] dtos = { new DTO("11", Encoding.UTF8.GetBytes("test11")), new DTO("12", Encoding.UTF8.GetBytes("test12")) };
object[]  values = { dtos };
var function = GetFunction("SaveEntities");
gas = await function.EstimateGasAsync( _account.Address, null, null, values);
var receipt = await function.SendTransactionAndWaitForReceiptAsync(_account.Address, gas, null, null, null, values);


public DTO(string id, byte[] hash)
{
    this.id = id;
    this.hash = hash;
}

protected Function GetFunction(string contractName)
{
    var web3 = new Web3(_account, _url);
    var contract = web3.Eth.GetContract(_contractAbi, _contractAddress);
    var function = contract.GetFunction(contractName);
    return function;
}
...