以太坊/Solidity - 查询交易

8
Solidity能否根据交易数据查询其在区块链上的状态?这里的查询是指在智能合约内运行的Solidity代码(而不是在智能合约外部运行的web3.js)。
昨天,我的合约执行了一笔预付款交易,今天我想查询所有具有“dp”或预付款类型的区块链交易。我希望这个查询代码在我的智能合约内运行或执行。
我不是要一个tx哈希,我想根据参数(如交易类型、来自地址或日期/时间等)查询特定交易或交易的整个tx数据。
注意:我想通过在智能合约内执行Solidity代码来查询这些交易。我不想使用web3.js,请不要提供使用web3.js的答案——查询必须在Solidity代码中完成。感谢您的帮助,但如果您的答案是web3.js,那么您真的没有帮到我。

如果有人看过在solidity代码中查询区块链交易的示例,请发布链接或提及。很奇怪你可以将交易发布到区块链上,但是没有内置到solidity中的获取、检索或查询函数。说实话,这似乎太基本了。

我发现,虽然solidity可以进行事件日志记录,以便将所有tx记录到BC的特殊区域中,但遗憾的是,在智能合约内执行的solidity代码无法读取这些日志https://www.bitdegree.org/learn/solidity-events/

我就是不明白......为什么会有一种语言创建交易却不能读取或查询它们。对我来说,这根本没有意义。

非常感谢那些了解solidity的人的答案!!谢谢Vmusic

1个回答

4
这是不可能的。合约无法查询区块链历史中的任意状态。
你唯一的选择是:
1. 维护合约内部状态的记录,并检查这些状态以确定之前是否发生了交易/当前交易是否有效。 2. 使用web3从链下检索详细信息,并将其作为参数传递给您的合约。 3. 使用像oraclize这样的服务从智能合约中查询外部数据。这也最终会使查询变成链下操作,但您可以在智能合约中启动它并读取结果。

嗨Raghav - 我不太清楚交易如何改变智能合约的状态。它可能会改变余额,但不会改变状态(待处理,活动,取消等)。 - Alex Kerezy
余额是一种状态,其中之一。智能合约可以编写以执行各种操作。它所持有的任何当前值和标志都是合约的状态。 - Raghav Sood
嗨,Raghav --- 常函数怎么样?这个函数查询数据但不改变状态? - Alex Kerezy
常量已被弃用。现在有了视图(可以查询状态,但无法写入)和纯函数(无法读取或写入)。但是,视图函数也只能读取您合同内的变量,它们不能查找过去的交易。 - Raghav Sood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接