以太坊区块链是一个分布式账本,就像
imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
以太坊区块链是一种分布式账本,就像比特币区块链一样imToken下载,以智能合约的形式提供计算能力。以太坊区块链最基本的形式是一组相互连接的区块,每个区块都包含改变区块链状态的交易。
组成以太坊网络的节点保留区块链的副本,并负责向其中添加新的交易,确保其一致性和有效性。
那么节点如何将交易添加到区块链?
该过程很容易解释:节点从钱包/用户接收签名的交易,如果交易有效,则节点将其添加到区块链。
问题在于,一个节点可能会收到数千笔交易,并且区块以准恒定的速率(每隔几秒)添加到区块链中,并且一个节点还可能从不同的用户和它们连接到的其他节点接收不同的交易....我们需要某种缓冲区来存储所有这些传入的、尚未验证的交易...这是内存池“发挥作用”的地方,我将尝试从通用的角度描述它们是什么、它们如何工作以及它们可能有什么“副作用”。
它是什么以及它是如何工作的?
我们如何向区块链添加新交易?假设某人想将一些代币发送到另一个帐户?那么,这个人应该做的第一件事就是生成交易:
除其他事项外,交易至少包含:
一旦交易准备就绪,它需要被包含在未来的区块中才能被网络接受。
实现这一点的方法是将签名的交易广播到组成区块链网络的一个(或多个)节点。
节点接收您的交易并检查其有效性和真实性,然后将其转发到网络中的其他节点(他们检查发送者是否有足够的资金,更重要的是,签名是否正确)。
节点检查完交易后,会将其添加到自己的内存池中。区块添加到网络后,节点会重新检查自己内存池中的所有交易,因为区块中可能包含使内存池中的某些交易无效的交易。
基本上是节点的 RAM 内存,其中保存了“迄今为止”已验证的所有交易,这些交易已收到但尚未添加到区块链中。
事实上,根据区块链的不同,每隔几秒或几十秒就会生成一个区块,并且区块有一个最大大小限制,也就是说一个区块只能承载有限数量的交易。
如果用户向区块链发送交易的速度比区块链添加区块的速度快,那么许多交易将不得不在节点内存池中等待。
需要注意的是,由于其去中心化的特性,节点的内存池可能随时都不同,它们可能保存不同的交易。同样重要的是(需要注意的是),您的交易也可能随时存在于多个节点的内存池中。
有时我们将内存池称为单个实体/位置,但实际上它是时间 T 存在的所有内存池的集合。
节点将从其内存池中选择交易来打包成块以添加到区块链,但节点不会遵循先进先出的政策,他们会选择他们认为最方便的交易,基本上是支付最高费用的交易,因为这将最大化他们的利润。
一旦矿工最终从其内存池中获取一笔交易并将其添加到区块中,则所有其他在其内存池中拥有相同交易的节点将继续删除它,因为相同的交易不能被添加到区块链两次。
每个节点的内存池就像火车站的候车区,乘客在这里等待下一班火车的到来,只有愿意付最多钱的人才能上车。有一个奇特之处是,一个乘客可以同时出现在多个火车站以太坊和比特币区块链钱包,而当他或她进入一列火车的那一刻,他或她就从所有其他火车站消失了!
交易的附加效果:取消交易
节点是不受信任的代理,从某种意义上说,它们总是会以自己的最佳利益行事,如之前所述,它们将首先选择那些支付最多费用的交易,这实际上是我们可以利用的行为,基于此,我们可以在需要时取消交易(当然,尚未添加到区块链的交易!)。
为了取消之前的交易,我们需要从同一个账户向网络提交一个新交易,使用相同的随机数,但需要更高的费用(gas 价格)。
节点将收到您的新交易,由于它支付的费用比之前的交易更高,因此它们将首先将其添加到区块链中。交易随机数只能用于特定帐户一次,这意味着当他们将新交易添加到区块链时,旧交易将失效并从内存池中删除。
交易领跑者
由于节点在将交易添加到区块链之前将其保存在其 集群中,因此它们可以访问交易内容并可以提前检查它们对区块链造成的影响(状态变化)。
假设您为第一个提交值(该值被哈希化为存储在智能合约中的值)的账户提供某种奖励,那么这可能会给您的 dapp 带来问题。如果有人向节点提交了正确的答案,该节点将有权访问该值,并且可以非常轻松地生成自己的交易,复制它,并首先将其添加到区块链中,从而“窃取”诚实用户的奖励。
这只是交易抢先交易的一个例子,但在更多情况下,交易添加到区块链的“速度”或“顺序”可能会对你的 dapp 逻辑产生影响,你应该始终记住,这可能会被破坏。
原来的:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。