以太坊交易验证
一直以来我都误以为以太坊交易验证整个是放进虚拟机(EVM)来执行的。最近才意识到在执行之前需要先验证签名而且是必须先验证签名,既:
1. 验证签名。
2. 虚拟机执行交易。
在说此设计的必要性之前有个大家都共识的是:
交易执行失败是需要扣手续费的,然而因为签名不通过的交易是不能扣手续费的,原因:
签名不通过是因为没有用合法的私钥或者签名的信息和交易信息不一致,倘若签名不通过还需要扣手续费,那么任何人都可以用不合法的签名伪造某个地址发交易,这样一来那个被伪造的地址在什么都没做的情况下就会被恶意扣手续费。因此签名不合法不能扣手续费。
如下图,在AsMessage中对签名身份进行了验证,并没有因为不合法的签名而计算消耗的gas。
然而,EVM执行过程中是会计算手续费的,并把交易改变的账户stateObject对应的情况(比如说扣钱加钱)放进stateDB的,所以我们要在EVM计算之前就验证交易签名。倘若把签名放在最后一步验证,倘若签名验证不通过,根据以上“签名不扣费原则”,那么需要stateDB回滚此交易改变的状态,无疑这种方案是浪费矿工计算量的而且麻烦。所以还是在EVM之前就验证签名。
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!