以太坊是何时执行智能合约的方法的?
发布于 8 个月前 作者 mysql2017 2896 次浏览 来自 以太坊

当用户发起一笔交易(ethSendTransaction)的时候,交易会先提交到节点的交易池(txpool)

当矿工挖到一个块的时候,会从交易池中获取一个或多个交易,放到块中去

请问,获取到的交易是在放入块之前执行,还是之后执行。还是在什么其他的时间执行。

执行是顺序执行,还是并行执行?

9 回复

这个问题很有意思,同关注,坐等大神

坐等大神回答

关于“放入块之前,和放入块之后”,矿工是在当前最新块的基础上执行所有的交易,执行完交易后(顺序执行),矿工再尝试对块进行签名,pow主要是在seal这个阶段需要花费算力,只有成功对块进行签名后,该块才算是成功出块了,其内容才会被写入链;在收到新块后,矿工会在收到的新块基础上重新执行交易,(原来没有出块的内容相当于被丢弃了)后再尝试对块进行签名。

很有趣的问题~周一回答你~ 我们周一见~哈哈哈

放在块之前 进 txpool 时 会预执行(就是跑下vm,不记结果)来验证交易是不是有效合法。 真正对区块链数据(账本)做更改是打包,解析执行区块的时候执行,是顺序执行的。因为同一个块里交易可能有nonce 先后顺序。

矿工挖矿(mine) 的前提是: 矿工已经准备好了一个区块( work 对象), 这里的 work 可以看作一个新区块的所需要的环境和数据(区块中所有的 tx 已经处理完了 ),此时新区块就差工作量证明了(POW),这时候矿工是在拼命的寻找一个合适的nonce值.矿工在挖矿中(mining)根本不会处理任何 tx_pool 通知来的新 tx.

关于你说的何时处理 tx: 1 矿工本地区块数据是最新的时候, 启动节点即会处理 tx_pool 中已经 pending 的 tx 2 别的矿工成功挖出一个区块,并得到共识, 此时矿工基于新区块, 然后处理 tx_pool ,生成一个新的work对象, 然后继续 pow 3 矿工不在挖矿时, 只要 tx_pool 中有新的tx添加, 矿工都会处理的

@xianfeng92 大神的意思就是我们用户(不是矿工)的所有交易都是由矿工来执行的,矿工会一直打包区块,在打包区块的时候就是执行交易了嘛?还是说等到POW共识之后获得记账权的矿工在广播区块的时候才执行交易呢?

@zhaoyao 打包区块的时候就是执行交易了

@xianfeng92 所以说交易其实是广播了两次,一次是放到了交易池里,一次是区块广播的时候

回到顶部