我们可以在智能合约中使用 Solidity 获取过去区块中记录的交易信息吗?

Posted

技术标签:

【中文标题】我们可以在智能合约中使用 Solidity 获取过去区块中记录的交易信息吗?【英文标题】:Can we get transaction information recorded in the past block using Solidity in the Smart contract? 【发布时间】:2018-11-30 15:55:44 【问题描述】:

我正在研究以太坊的区块链,我想在使用 Solidity 的智能合约中使用过去的交易数据。 如果我在用javascript编写的程序中使用Web3.js模块,我可以很容易地得到这些数据。 但我无法使用 Solidity 在智能合约中获取这些数据。

Solidity 的参考说我们可以通过“block.number”和“block.blockhash(uint blockNumber)”函数获取当前区块号、blockhash 等,但没有提到获取交易数据。 (http://solidity.readthedocs.io/en/latest/units-and-global-variables.html#special-variables-and-functions)

enter image description here

请帮帮我。

【问题讨论】:

【参考方案1】:

答案很简单。不幸的是,您根本无法从 Solidity 访问链上的旧交易或区块数据。最多可以访问最后 256 个区块的哈希(参见 documentation 中的 blockhash

或者,作为一种解决方法,您可以考虑使用Oraclize。 Oraclize 代表在链上读取链下数据的方式,因此您可以尝试从 Etherscan Web API 读取交易数据。 Oraclize 的工作方式是:

    您向 Oraclize 智能合约请求您想从互联网获取哪些数据(某些 URL) Oraclize 链下服务器然后检测您的链上请求 查找您想要的数据(他们会向您提供的 URL 发出一些 http 请求) 一旦他们得到响应,他们就会将包含您请求的数据的交易发送到您的合约(调用特定的回调方法)

但是,使用这种方法,您依赖的是:

    EtherScan 已启动并运行 Oraclize 未运行。

如果您只关心与智能合约相关的交易数据,另一种方法是将交易数据存储在链上。如果您能告诉我们更多关于您要解决的具体问题,也许我们可以给您更多建议。

【讨论】:

非常感谢您的及时回复。使用 Oraclize 的方式也很有帮助。我正在尝试开发一个智能合约来从过去的交易信息中检查新注册信息的有效性,所以我想获取智能合约的交易信息。

以上是关于我们可以在智能合约中使用 Solidity 获取过去区块中记录的交易信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

智能合约从入门到精通:用Solidity开发一个“Hello World”

Solidity实现简单的智能合约

智能合约常见攻击方式

智能合约从入门到精通:Solidity Assembly

solidity 智能合约(3):使用truffle编译部署及测试合约

智能合约从入门到精通:Solidity的特性与内部机制