如何获取智能合约结果数据?
How to get Smart Contract Result data?
举个例子,我们有一个输入数据和智能合约结果的交易
- 输入数据:
issueNonFungible@415344@415344
- 结果:
@ok@4153442d383661353439
这是新 NFT Collection 的简单创建。可以在这个 txHash 的 devnet 上看到它:
290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062
我正在尝试获取智能合约的响应。这是我现在的代码,consts.walletAddress 是初始交易发送者的钱包地址。
var txHash = new TransactionHash("290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062");
var toTest = await this.provider.getTransaction(txHash, new Address(consts.walletAddress), true);
var scResults = await toTest.getSmartContractResults();
console.log(scResults)
这是 console.log
输出的内容:
问题是没有为智能合约结果输出数据所以我无法得到智能合约的响应。
我做错了什么还是 erdJs 中的错误?
您的代码完全没问题。通过 npm 分发的最新 erdjs 版本中只有一个小错误。
在 TransactionOnNetwork
class 包中的代码当前如下所示:
static fromHttpResponse(response) {
let transactionOnNetwork = new TransactionOnNetwork();
transactionOnNetwork.type = new TransactionOnNetworkType(response.type || "");
transactionOnNetwork.nonce = new nonce_1.Nonce(response.nonce || 0);
transactionOnNetwork.round = response.round;
transactionOnNetwork.epoch = response.epoch || 0;
transactionOnNetwork.value = balance_1.Balance.fromString(response.value);
transactionOnNetwork.sender = address_1.Address.fromBech32(response.sender);
transactionOnNetwork.receiver = address_1.Address.fromBech32(response.receiver);
transactionOnNetwork.gasPrice = new networkParams_1.GasPrice(response.gasPrice);
transactionOnNetwork.gasLimit = new networkParams_1.GasLimit(response.gasLimit);
transactionOnNetwork.data = transactionPayload_1.TransactionPayload.fromEncoded(response.data);
transactionOnNetwork.status = new transaction_1.TransactionStatus(response.status);
transactionOnNetwork.hyperblockNonce = new nonce_1.Nonce(response.hyperblockNonce || 0);
transactionOnNetwork.hyperblockHash = new hash_1.Hash(response.hyperblockHash);
transactionOnNetwork.receipt = Receipt.fromHttpResponse(response.receipt || {});
transactionOnNetwork.results = smartContractResults_1.SmartContractResults.fromHttpResponse(response.results || []);
return transactionOnNetwork;
}
如您所见,它尝试从响应中的 results
字段解析 SmartContract 结果。
然而,改为解析 smartContractResults
字段是正确的。
这也可以在官方github中看到,这个问题似乎已经解决了。
所以现在您可以手动修补 node_modules
中的 transactionOnNetwork.js
文件以使用 smartContractResults
或者降级到较低版本,直到这个问题在最新的 npm 中得到解决包。
举个例子,我们有一个输入数据和智能合约结果的交易
- 输入数据:
issueNonFungible@415344@415344
- 结果:
@ok@4153442d383661353439
这是新 NFT Collection 的简单创建。可以在这个 txHash 的 devnet 上看到它:
290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062
我正在尝试获取智能合约的响应。这是我现在的代码,consts.walletAddress 是初始交易发送者的钱包地址。
var txHash = new TransactionHash("290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062");
var toTest = await this.provider.getTransaction(txHash, new Address(consts.walletAddress), true);
var scResults = await toTest.getSmartContractResults();
console.log(scResults)
这是 console.log
输出的内容:
问题是没有为智能合约结果输出数据所以我无法得到智能合约的响应。 我做错了什么还是 erdJs 中的错误?
您的代码完全没问题。通过 npm 分发的最新 erdjs 版本中只有一个小错误。
在 TransactionOnNetwork
class 包中的代码当前如下所示:
static fromHttpResponse(response) {
let transactionOnNetwork = new TransactionOnNetwork();
transactionOnNetwork.type = new TransactionOnNetworkType(response.type || "");
transactionOnNetwork.nonce = new nonce_1.Nonce(response.nonce || 0);
transactionOnNetwork.round = response.round;
transactionOnNetwork.epoch = response.epoch || 0;
transactionOnNetwork.value = balance_1.Balance.fromString(response.value);
transactionOnNetwork.sender = address_1.Address.fromBech32(response.sender);
transactionOnNetwork.receiver = address_1.Address.fromBech32(response.receiver);
transactionOnNetwork.gasPrice = new networkParams_1.GasPrice(response.gasPrice);
transactionOnNetwork.gasLimit = new networkParams_1.GasLimit(response.gasLimit);
transactionOnNetwork.data = transactionPayload_1.TransactionPayload.fromEncoded(response.data);
transactionOnNetwork.status = new transaction_1.TransactionStatus(response.status);
transactionOnNetwork.hyperblockNonce = new nonce_1.Nonce(response.hyperblockNonce || 0);
transactionOnNetwork.hyperblockHash = new hash_1.Hash(response.hyperblockHash);
transactionOnNetwork.receipt = Receipt.fromHttpResponse(response.receipt || {});
transactionOnNetwork.results = smartContractResults_1.SmartContractResults.fromHttpResponse(response.results || []);
return transactionOnNetwork;
}
如您所见,它尝试从响应中的 results
字段解析 SmartContract 结果。
然而,改为解析 smartContractResults
字段是正确的。
这也可以在官方github中看到,这个问题似乎已经解决了。
所以现在您可以手动修补 node_modules
中的 transactionOnNetwork.js
文件以使用 smartContractResults
或者降级到较低版本,直到这个问题在最新的 npm 中得到解决包。