多钱包管理
在区块链应用中,币的充值是很重要的一环(如:将币转到交易所进行买卖)
场景
机构支持用户的充值,需要给用户提供一个钱包地址用于充值(入金):
- 方式1:为每个用户生成不同的钱包地址
- 方式2:所有充值用一个地址,通过其他方式区分
不同用户不同的充值地址
这本身也有很多种实现方式,不同的方式有不同的优缺点。 不同用户不同的充值地址,项目方需要按需进行资金的归集(汇总),如果不是原生币(如ERC20),项目方还需要额外转一笔手续费才能归集资金。
- 傻瓜式的,直接为每个用户生成一个私钥/钱包地址
- 实现方式:用任意一个普通钱包,就能够无限生成私钥/钱包地址
- 优点:没什么技术难度,直接用原生的钱包就可以
- 缺点:需要管理大量的私钥,需要用数据库记录私钥和用户的关系
- 用HD钱包(分层确定性钱包):BIP32、BIP44、BIP39
- 实现方式:先随机生成一个seed,然后基于协议,生成用户的私钥(基于确定性规则,BIP32)
- 优点:只需要保存好一个seed,则钱包里的资产是安全的
- 缺点:如果seed泄露,则所有的钱包里的资产都处于高风险状态;seed不能改变(可以通过多个seed进行分组,降低风险)
- 更深入的理解HD钱包
- 基于智能合约的钱包
- 实现方式:通过合约,为每个充值用户创建一个收款合约,合约的地址就是充值地址
- 优点:智能合约可以定义多种的逻辑,增加权限控制/多签管理;也能够按需增加/删除管理人,更加灵活可控。
- 缺点:需要为每个用户创建一个收款合约,机构侧的成本增加;需要区块链支持智能合约(bitcoin不适合这种方式)
- 有兴趣的可以分析coinbase的eth的充值方案,一笔充值记录
所有充值用同一个钱包地址
这种方式不需要额外的资金归集;出入金的监控也只需要监控一个地址,更加简单。 但这种方式很多项目方都不采用,因为它增加了用户的操作。
- 基于普通钱包地址,简单的转账操作
- 实现方式:用户需要注册,预先绑定自己的钱包地址。充值时,只记录绑定的钱包地址,其他充值会被忽略。机构只需要查看transaction.from,就能够知道是哪个用户充值
- 优点:实现简单,收款地址也可以替换为gnosis safe之类的多签地址。
- 缺点:需要用户事先绑定他们自己的钱包地址,增加用户的操作流程
- 基于智能合约的收款
- 实现方式:充值是通过调用智能合约的方式,用户ID(可以替换为其他参数)作为合约参数。链下监听合约的事件,基于用户ID记录不同用户的充值
- 优点:链上事件记录了所有的充值记录;智能合约也允许基于多签进行管理,更安全。
- 缺点:充值是调用合约,而不是普通的转账,增加操作难度;执行合约也需要额外的手续费。