交易输出的数据管理

时间:2018-11-07 10:54:54

标签: blockchain solidity smartcontracts web3

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

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

谢谢。

0 个答案:

没有答案