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

**URL:** <https://fans.tokenpocket.pro/t/topic/5809>\
**Category:** Trends & Activities  | 最新动态\
**Created:** [2021 年10 月 21 日 04:19 UTC](https://fans.tokenpocket.pro/t/topic/5809 "2021-10-21T04:19:51Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![dotbit](https://sea2.discourse-cdn.com/flex020/user_avatar/fans.tokenpocket.pro/dotbit/32/598_2.png) [@dotbit](https://fans.tokenpocket.pro/u/dotbit)\
发布日期： [2021 年10 月 21 日 04:19 UTC](https://fans.tokenpocket.pro/t/topic/5809/1 "2021-10-21T04:19:51Z")

</div>

> 原作者： specer，原文地址：[https://talk.da.systems/t/topic/117](https://talk.da.systems/t/topic/117)

# 背景

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

# 正文

## 字段说明

EIP712 的内容总共有 8 个字段

| 字段名 | 解释 |
| --- | --- |
| DAS\_MESSAGE | 交易内容的语义化后的结果，普通用户主要就是确认这个字段内容是否符合本次交易的预期即可 |
| inputsCapacity | 交易里输入部分的总的金额 |
| outputsCapacity | 交易里输出部分总的金额 |
| fee | 交易的手续费 |
| action | 交易的操作名及参数 |
| inputs | 交易的输入部分，是一个数组，只会列举出涉及 DAS 合约的 cell，同类 cell 会合并 capacity |
| outputs | 交易的输出部分，是一个数组，只会列举出涉及 DAS 合约的 cell，同类 cell 会合并 capacity |
| digest | 严格按照 CKB 系统的 [签名逻辑](https://github.com/nervosnetwork/ckb-system-scripts/wiki/How-to-sign-transaction) 生成的交易摘要，对应唯一的一笔 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 {} | 购买账户 |

## 举例说明

### 编辑解析记录

 ![image](https://us1.discourse-cdn.com/flex020/uploads/tokenpocket1/original/2X/d/d4a463025490a1b64798c5750c6366d257ce78ad.jpeg)

通过阅读 DAS\_MESSAGE 字段内容，我们可以知道，本次操作正在修改账户 5678567856789.bit 的解析记录，至于修改了具体什么解析记录，这里就没有显示了（原因在上一篇文章 [EIP712](https://talk.da.systems/t/das-lock-script-eip712/74) 里有说明）。下面详细说明一下各个字段的主要含义：

- fee 字段表明本次交易付出的手续费为 0.0001 CKB
- inputs 里的 capacity 指 account cell 的capacity 大小，DAS 会使用其中总共不超过 1 个 CKB 用作链上手续费。看上图的信息，这个账户差不多还能进行大约 9998 次账户操作
- inputs 的 lock 和 type 表明 account cell 挂上了 das-lock 和 account-cell-type，关于这两个合约的详细内容，可以转去阅读我们在 github 上开源的文档 [资料](https://github.com/DeAccountSystems/das-contracts/blob/master/docs/zh-hans/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/Cell-%E7%BB%93%E6%9E%84%E5%8D%8F%E8%AE%AE.md#accountcell)
- inputs 的 data 的 account 指账户名，expired\_at 指账户的过期时间
- extraData 的 status 指账户的状态，0 为正常状态，1 为出售中。records\_hash 指整个解析记录的 hash 值，因为这里是修改解析记录，所以可以看到 inputs 和 outputs 里的这个值不一样。目前只有 account cell 的 data 和 extraData 才会有值，其他 cell 的这两个字段为空

### 挂单售卖

 ![image](https://us1.discourse-cdn.com/flex020/uploads/tokenpocket1/original/2X/8/8bb7c57694915606357fcabc054713e218a5095a.jpeg)

一样的先确认 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](http://bestdas.com/) 上，当把钱从交易所或者钱包充值到“备用地址”后，点击“激活”按钮的时候可能会签一笔红字交易，这个也是整个 DAS 生态中唯一的且也是不可避免的一笔“未知”的交易。下面我会详细解释一下造成这个现象的原因：

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

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

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

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

 ![image](https://us1.discourse-cdn.com/flex020/uploads/tokenpocket1/original/2X/f/ffecba955e6a63f22d009948d3fa7ef854420cfd.png)

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

> 还记得在上一篇 [EIP712](https://talk.da.systems/Users/apple/OuterStorage/Dropbox/notebook/%E5%B7%A5%E4%BD%9C%E6%96%87%E6%A1%A3/DAS/EIP712.md) 的文章里有提到一个不会添加任何前缀的 eth sign 吗？他可以对任意的字符串做纯原文的签名，所以这个原文也可以是一串交易 hash……

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

 ![image](https://us1.discourse-cdn.com/flex020/uploads/tokenpocket1/original/2X/0/0fd43554e6499b9777c4691dbe8f866cd7a79cad.png)

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

### 更多阅读

- [BestDAS.com - 基于 DAS 的去中心化一口价交易市场，正式上线](https://fans.tokenpocket.pro/t/topic/5807)
- [常见问题 | BestDAS.com](https://fans.tokenpocket.pro/t/topic/5808)
- [DAS Now Settles in fans.tokenpocket.pro](https://fans.tokenpocket.pro/t/das-now-settles-in-fans-tokenpocket-pro/3123)
- [社区工具 das.la 重大更新，新增支持数据看板，专业、酷炫～](https://fans.tokenpocket.pro/t/topic/4336)
- [DAS-Decentralized Account Systems: A Future-proof Cross-chain Decentralized Account](https://fans.tokenpocket.pro/t/topic/5388)
