原作者: specer,原文地址:如何正确阅读签名内容 - 中文 - DAS 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 长地址的原因,最终采取这个方案也实属无奈。