Управление данными, выведенными из транзакции - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть умный контракт, в котором я моделирую событие с помощью набора, который вручную вводит определенные данные, например: (я использую Remix)

[ "From", "to", "object", [ "rules1", "rules2"]], [[1, "data1"], [2, "data2"], [3, "data3"]]

Это мой код:

pragma experimental "v0.5.0";
pragma experimental ABIEncoderV2;

contract StructContract {

    struct Certificate{
        uint id;
        string data;
    }

    struct StructEvent {
        string _from;
        string _to;
        string _object;
        string[] _rules;
    }

    StructEvent structEvent;
    Certificate[] certificate;

    function setEvent(StructEvent eventS,Certificate[] eventC)  public{
            certificate.length=0;
            structEvent = eventS;
            for(uint i=0;i<(eventC.length);i++){
              certificate.push(Certificate(eventC[i].id,eventC[i].data));
            }
    }
    function getStruct() view public returns(StructEvent){
        return(structEvent);
    }
    function getCertificate() view public returns(Certificate[]){
        return(certificate);
    }
    function returnAllData() view public returns(StructEvent,Certificate[]){
        return(structEvent,certificate);
    }

}

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

Поэтому мне нужно иметь данные, которые помещаются в цепочку блоков, для решения этой проблемы я создал следующий код: (я использую web3 1.0.0-beta.36)

function printTransaction(txHash) {

  web3.eth.getTransaction(txHash, function (error, tx) {
    if (tx != null) {
      var inputData = tx.input;
      try {
        var myContract = new web3.eth.Contract(abi, tx.to);
        var result = web3.eth.abi.decodeParameters(['tuple(string,string,string,string[])',
          'tuple(uint,string)[]'], inputData.slice(10));
        var data1 = result[0];
        var data2 = result[1];
        console.log("\n\n");
        console.log("--- transactions ---");
        console.log("   tx hash         : " + tx.hash + "\n"
          + "   nonce           : " + tx.nonce + "\n"
          + "   blockHash       : " + tx.blockHash + "\n"
          + "   blockNumber     : " + tx.blockNumber + "\n"
          + "   transactionIndex: " + tx.transactionIndex + "\n"
          + "   from            : " + tx.from + "\n"
          + "   to              : " + tx.to + "\n"
          + "   value           : " + tx.value + "\n"
          + "   gasPrice        : " + tx.gasPrice + "\n"
          + "   gas             : " + tx.gas + "\n"
          + "   input           : " + tx.input + "\n"
          + "   decodeinput     : " + "\n"
          + "                     Struct          : " + data1 + "\n"
          + "                     Certificates    : " + data2);

        web3.eth.getAccounts(function (err, account) {
          myContract.methods.setEvent(data1, data2).send({ from: account[0], gas: 3000000 }, function (err, resul) {
            if (err) {
              console.log("err");
            } else {
              console.log("\n\n");
              console.log("--- data ---");
              myContract.methods.returnAllData().call().then(console.log);
            }
          });
        });
      } catch (Error) { }
    }
  });
}

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

эти методы, которые я создал, представляют собой правильное решение? или я должен использовать другой подход, другой метод для этого?

Заранее спасибо.

...