1. 1
如何构建一套以太坊的 C2C 商城支付系统

为了避免中心化,可以使用智能合约构建一套,类似于 bip32 工厂合约,用于创建新的支持收款合约,买家付款后,卖家监听这个这个合约的地址余额变化。

不过这样有个很大问题,每次付款都要生成一个新合约,卖家太浪费钱了,遇到恶意下单而不付款更损失钱。

另外还有个问题,如果买家都是善良的,不会恶意,但是创建合约账户的计算公式是 keccak256(rlp([sender, nonce])) ,这个和发送者及其 nonce 相关,而这里的 nonce 准确说是序列(sequence)并不是实际随机数,所以开发者并不能随意控制合约账户的生成,如果要生成第 100 个合约账户,还得需要先创建前 99 个。

CREATE2 解决了这两个问题,一方面允许开发者不依赖 nonce 的情况下控制账户的生成方式,另一方面开发者可以先使用,需要时再进行创建。

怎么做到的呢?其实很简单。账户标志符号,本质上就是 20 字节的随机数,无论从什么方式生成这 20 字节都可以作为账户使用。那么只要定义安全的账户生成方式即可。

CREATE2 定义了新的账户生成方式:keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]。这里的 address 还是指发送者账户,可以是合约账户,也可以是外部账户;salt 是额外的数据,固定为 32 字节,开发者可以随意控制;init_code 是合约初始化代码及其参数。

  1.