第12节:安全事故2-OP代币重放攻击
小白入门:https://github.com/dukedaily/solidity-expert ,欢迎star转发,文末加V入群。
当前的区块链系统中,用户对交易的签名有两种形式:
- 包含6个字段信息(RLP编码元素):
nonce, gasprice, startgas, to, value, data
。 - 包含9个字段信息(RLP编码元素)
nonce, gasprice, startgas, to, value, data, chainid, 0, 0
,多了后面三个字段。(主要区别是chainid)
对于第一种交易,签名v值为:{0,1} + 27
,第二种交易形式(符合EIP1155标准):签名v值为:{0,1} + chainid * 2 + 35
根据ECDSA签名原理我们知道(r,s,v):在v值不相同的时候,即使r和s相同,还原出来的公钥也是不相同的。所以满足EIP1155标准的交易可以阻止重放攻击。
当前的区块链世界是一个多链并存的世界,并且很多链都是EVM兼容的,对于不带chainid的签名交易,我们可以把这条链上的交易信息读取出来,然后在另外一条链上执行,这样就会导致交易被再次执行(因为签名都是有效的),这就是所谓的重放攻击,所以使用chainid可以保证无法被重放,因为每条链的chainid不同。
重放方法:
- 在A链上直接获取data数据
- 在B链上调用方法:eth_sendRawTransaction直接发送交易即可,点击查看手册
案例分析:
OP代币被重放攻击案例分析:点击查看