В корпоративной частной сети мне нужно защищать терабайты информации в процессе сбора данных аудита. Для этого мне нужно было бы отправить большую часть данных в одном запросе, и для этого у меня есть эта функция в контракте:
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;
}