DAS 研发工程师:如何正确阅读签名内容

原作者: specer,原文地址:如何正确阅读签名内容 - CN - .bit Talk

背景

之前上线了 DAS 的 EIP712 算法后,一些用户反馈看不懂,这篇文章就专门介绍如何正确阅读 EIP712 的签名内容

正文

字段说明

EIP712 的内容总共有 8 个字段

字段名 解释
DAS_MESSAGE 交易内容的语义化后的结果,普通用户主要就是确认这个字段内容是否符合本次交易的预期即可
inputsCapacity 交易里输入部分的总的金额
outputsCapacity 交易里输出部分总的金额
fee 交易的手续费
action 交易的操作名及参数
inputs 交易的输入部分,是一个数组,只会列举出涉及 DAS 合约的 cell,同类 cell 会合并 capacity
outputs 交易的输出部分,是一个数组,只会列举出涉及 DAS 合约的 cell,同类 cell 会合并 capacity
digest 严格按照 CKB 系统的 签名逻辑 生成的交易摘要,对应唯一的一笔 CKB 交易

截止本文发表为止,DAS 所有涉及 EIP712 操作的 action 种类及其语义化后的结果如下表所示

action DAS_MESSAGE 解释
transfer_account TRANSFER THE ACCOUNT {} TO {} 转移 owner
edit_records EDIT RECORDS OF ACCOUNT {} 编辑解析记录
edit_manager EDIT MANAGER OF ACCOUNT {} 编辑 manager
transfer/withdraw_from_wallet TRANSFER FROM {} TO {} 转账/提现
start_account_sale SELL {} FOR {} 挂单卖账号
edit_account_sale EDIT SALE INFO, CURRENT PRICE IS {} 修改卖单信息
cancel_account_sale CANCEL SALE OF {} 取消挂单
buy_account BUY {} WITH {} 购买账户

举例说明

编辑解析记录

通过阅读 DAS_MESSAGE 字段内容,我们可以知道,本次操作正在修改账户 5678567856789.bit 的解析记录,至于修改了具体什么解析记录,这里就没有显示了(原因在上一篇文章 EIP712 里有说明)。下面详细说明一下各个字段的主要含义:

  • fee 字段表明本次交易付出的手续费为 0.0001 CKB
  • inputs 里的 capacity 指 account cell 的capacity 大小,DAS 会使用其中总共不超过 1 个 CKB 用作链上手续费。看上图的信息,这个账户差不多还能进行大约 9998 次账户操作
  • inputs 的 lock 和 type 表明 account cell 挂上了 das-lock 和 account-cell-type,关于这两个合约的详细内容,可以转去阅读我们在 github 上开源的文档 资料
  • inputs 的 data 的 account 指账户名,expired_at 指账户的过期时间
  • extraData 的 status 指账户的状态,0 为正常状态,1 为出售中。records_hash 指整个解析记录的 hash 值,因为这里是修改解析记录,所以可以看到 inputs 和 outputs 里的这个值不一样。目前只有 account cell 的 data 和 extraData 才会有值,其他 cell 的这两个字段为空

挂单售卖

一样的先确认 DAS_MESSAGE ,表明这是一笔售卖账户的交易:以 234 CKB 的价格出售 5678567856789.bit

我们看到交易里的 account cell 在 inputs 和 outputs 里的 capacity 都是 223.9998 ,因为这笔交易的手续费是由 inputs 里的下标为 1 的那个 cell 出的。另外,在 outputs 的 account cell 的 status 字段值也变成 1 了,因为变成了售卖中了嘛

另外这笔交易的 outputs 里出现了一个下标为 1 的 account-sale-cell ,这是一个挂单 cell,用户可以通过这个去链上检索出所有已经挂单的账户

其他说明

细心的同学应该能够发现在 bestdas.com 上,当把钱从交易所或者钱包充值到“备用地址”后,点击“激活”按钮的时候可能会签一笔红字交易,这个也是整个 DAS 生态中唯一的且也是不可避免的一笔“未知”的交易。下面我会详细解释一下造成这个现象的原因:

  • 首先,部分交易所和钱包不支持 CKB 长地址作为提现/转账地址,然而作为 DAS 生态里面存储用户余额的 das-lock 是一个长地址(也只能是一个长地址)
  • 其次,我们团队做的产品都是以 尽可能追求去中心化 为目标,任何中心化的元素我们都会尽可能地不采用。

基于以上两点需求,我们最终想出了目前的比较极客的解决方案:

因为 CKB 和 ETH 都是使用了一样的加密算法生成公私钥对,基于此,我们理论上可以由 ETH 公钥推导出唯一确定的 CKB 地址,事实上我们也确实做到了。

先让用户签名一笔任意文字的交易,然后还原出 ETH 的公钥:

以上,从交易所或者钱包就可以将 CKB 转到这个由用户 ETH 私钥生成的 CKB 短地址上,接下来就是如何将其再转入到 das-lock 的长地址。

还记得在上一篇 EIP712 的文章里有提到一个不会添加任何前缀的 eth sign 吗?他可以对任意的字符串做纯原文的签名,所以这个原文也可以是一串交易 hash……

于是我们先在服务端组装好一笔从中转地址转钱到可用地址的交易,然后提示用户签名后,再将其上链。因为必须要用到 eth sign 所以这笔交易会是也只能是一笔红字交易:

通过以上两个步骤就解决了如何将短地址的钱转移到 DAS 生态的长地址的问题,这个方案有一定的风险,但是因为部分终端都不支持 CKB 长地址的原因,最终采取这个方案也实属无奈。

更多阅读