首页 > 解决方案 > 事务输出的数据管理

问题描述

我有一个智能合约,我通过一组手动输入某些数据来模拟一个事件,如下所示:(我使用 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 文件中创建一个方法,该方法能够接受交易,解码与其中包含的数据相关的输入,并通过发送将这些数据传递给我的智能合约,它将在其中使用。

我创建的这些方法代表了正确的解决方案?或者我必须使用另一种方法,另一种方法来做到这一点?

提前致谢。

标签: blockchainsoliditysmartcontractsweb3

解决方案


推荐阅读