Hyperledger Sawtooth正在使用transaction processor执行事务并验证状态更改。
由于事务处理器运行任意代码,因此如何对其进行验证?
例如,如果它生成一个随机数进行计算或从互联网上获取可以更改的数据?
答案 0 :(得分:2)
简而言之,我可以将这个问题的答案引用为
任何书面的交易处理程序都应具有确定性。确定性行为是,对于给定的输入状态,智能合约中的逻辑应始终求值为特定的输出状态。对于给定的输入状态,结果应相同,无论何时执行,在何处执行。
我相信这条规则也适用于所有其他区块链框架。此行为是稍后验证交易的一种方式。
描述性很长的答案是,当事务发送到验证器时,它会广播到网络中的其他节点,并放入待处理队列中。根据共识引擎发出的命令,负责构建该区块的验证程序将处理未决交易,对其进行验证并放入一个区块中。为了验证,将交易发送到相应的交易处理器。事务处理器从全局状态读取数据(存储到当前链头之前的数据),应用其需要执行的操作并计算输出状态(如果接受当前块,则将数据存储在分类帐中)。
块准备就绪后,将广播到网络中的其他节点。当验证者收到该块时,它将验证放置在该块中的所有交易。请注意,建议的输出状态应与评估的输出状态相匹配,否则将丢弃到达的块。如果输出状态转换依赖于任意输入,则没有其他块验证程序可以接受该块的确定性行为。
注意:交易/批次的外观/句法验证发生了,我没有在回答中提及这些内容。请参阅official documentation以获得详细的答案。
只要您遵照此规则编写事务处理器,就可以从任何外部源读取数据/生成随机值。但是,如果您的交易处理器依靠任意数据来决定交易的有效性,那么交易结果也是任意的。