blockchain - 事务输出的数据管理
问题描述
我有一个智能合约,我通过一组手动输入某些数据来模拟一个事件,如下所示:(我使用 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 文件中创建一个方法,该方法能够接受交易,解码与其中包含的数据相关的输入,并通过发送将这些数据传递给我的智能合约,它将在其中使用。
我创建的这些方法代表了正确的解决方案?或者我必须使用另一种方法,另一种方法来做到这一点?
提前致谢。
解决方案
推荐阅读
- libreoffice - 如何在 Libreoffice writer 的标题下添加边框
- php - 使用数组中找到的数值从高到低排序多维数组
- python - val_auc 上的 Keras EarlyStopping 回调神秘地运行
- apache-spark - Spark忽略加入中的显式广播提示
- automation - 无法找到使用 FlaUILibraray XPath 的机器人框架
- flutter - 如何在依赖的flutter包中使用easy_localization?
- java - p:fileUpload 没有设置任何值
- asp.net-core - DBContext 构造函数中的用户声明有时为空
- continuous-integration - 无法添加 gitlab CI/CD 变量
- php - 无法在 docker 映像中找到包