EOS为更好地支持交易所发布重要文件

昨日BM在EOS开发者群中发布关于交易所重要文件的消息。他表示已经开始撰写一些关于交易所的文件,以兼容符合标准的token用于存款/提款。 同时,BM本人还表示这些文件利用了尚未合并到master分支中的功能,他认为应该让更多人了解整体设计。 他正在寻找反馈意见,以便可以更新cleos来更好地支持交易所的集成。以下为原文翻译。

关于交易所存取款的文档

本文档由IMEOS猫片翻译,IMEOS技术团队老威港校改,中文转载请注明出处。

本文档面向希望使符合标准EOSIO token合约的存取款能自动化的交易所。且区块链的本地token符合标准。

配置节点

本教程使用 命令行工具来操作本地 服务器。 需要配置下列插件:

eosio::wallet_api_plugin

eosio::history_api_plugin

eosio::chain_api_plugin

默认情况下,插件将保存所有帐户的历史记录,但这会在中期消耗几十GB的内存,所以不推荐直接这样配置。为了内存优化,应该将插件设置为仅记录与你的帐户相关的活动。这可以通过以下配置参数来实现,这些参数放置在config.ini中,或者作为命令行参数。

回放块链

如果你已经在没有插件的情况下同步了这个块链,那么你能需要回放这个块链来收集所有的历史活动。

你只需要回放一次,节点的后续运行不应该使用回放标记,否则你的启动时间将会变成非常长,而这是没有必要的。

接收存款

在设计本教程时,我们假设一个交易所会为即将进行交易对 进行遍历,并且可以知道一个转账在何时将会被认定为终止或者不可逆的。

在基于eosio的区块链中,一旦三分之二以上的BP确定了区块,区块中的交易就不可逆转了。这可能需要不到两分钟的时间,但无论哪种方式,节点会公布这个状态。

初始条件

现在我们存入一些资金到交易所:

这个输出表明action “eosio.token::transfer” 已经传递到 3 个账户/合约 (eosio.token, scott, 和交易所)。

eosio token 标准规定所有转账操作需要通知发送方和接收方帐户/合约,这样这些账户能够进行相应的操作。 此时,虽然 和 没有任何关联操作,但是交易记录仍会标记他们已得到通知。

遍历账户历史

不管账户是授权操作还是接收操作,账户历史都包含了所有的活动,当交易所收到了 action,它将被列出在历史记录中。如果你已使用控制台确认,那不可逆的交易将以“绿色”显示,而未经确认的交易则以“黄色”显示。如果没有颜色,你可以通过第一个字符“#”(表示不可逆)和“?”(表示可能是可逆的)来判断一个交易是否已被确认。

进行更多的转账操作:

最后一次移交仍然悬而未决,等待着不可逆转确认。

“seq”列表示你特定账户的action索引,会随着新的相关action增加而递增。

指令支持筛选需要显示的action,使用参数来获取命令帮助。

可以通过以下命令查询最后一个action:

这个命令表示从最后的索引(pos = -1 )开始往前查询1条(offset = -1)记录。所以这里返回了第2条记录。 跟C++容器一样,-1表示最后的索引。

仅抓取 “新” Actions

因为我们假定交易所能够遍历所有交易, 因此能够获取 “下一笔未被处理的存款” 。这种情况下,遍历服务需要跟踪 最后被处理的索引。在这个例子中,我们会假设 “seq 0” 已经被处理并且我们会抓取 “seq 1” (如果有的话)。

我们通过 pos=1 和 offset=0 来获得范围[1,1+0](即[1,1])的action。

当遇到被确认的action(以#开头)时自增索引继续查询,直到所有action都遍历完或者找到一个待确认action(以?开头)。

机器可读的账户历史记录(JSON)

目前为止,此教程主要侧重于运用抓取和显示历史记录,但是 cleos仅仅是一个调用json-rpc接口的轻量级客户端。 支持返回原始的json数据格式,你也可以封装自己的json-rpc请求。

这是查询序列2时返回的 JSON格式数据。

在这个JSON数据中,如果小于 那么action是不可逆的(最终)。

你可以通过下面这个表达式判断不可逆转的存款:

实际上,你应该给你的客户一个“备忘录”,用于识别你应该将哪些内部帐户记入存款。

警告

验证上述所有条件,包括token符号名称,是至关重要的。用户可以创建包含 “转账” action 的合约,来“通知” 你的账户。如果你没有验证上述所有的属性,那么你可能会接收到 “虚假存款”。

验证余额

现在我们收到3笔存款,应该看到交易所的余额是 3.0000 EOS 。

取款处理

(注意,在产生本教程的同时,scott 又存放了1.0000 EOS (seq 3),交易所的总余额为 4.0000 EOS。)

当用户要求从你的交易所提款时,他们需要提供他们的eosio账户名称和金额以完成取款。你可以运行 cleos命令,该命令将在应该只支持本地主机连接的 与 “解锁” 钱包交互运行。在应该只支持本地主机连接的节点上运行。更高级的用法会有一个单独的密钥服务器(),但会在之后介绍。

现在让我们假设一下 scott 想要提取:

在此阶段,你的本地客户接受了该交易,并且可能将其广播到网络中。

现在我们可以获取历史记录,并可以看到 trx id 为 的索引为3的action。因为 授权交易,它会被通知所有正在处理并接受 ‘转账’ 的账户。在此情况下, ‘eosio.token’ 合约处理(转账)并更新了余额,发送方(’exchange’)和接收方 (‘scott’) 都会处理它(转账),所有 3 个合约/账户都批准了(转账) 并/或 根据action执行了状态转换。

在处理历史记录的过程中,我们也可以在交易确认时得到通知。在实际应用中,在提现请求中插入memo信息是十分有用的,例如映射提现请求到账号私有数据库时可以便于追踪,当然也可以直接记录交易ID。

当帐户历史记录遍历服务查询到了 seq 5 并且该交易不可逆转,就可以将该提现(行为)标记为完成。

错误处理

有时网络问题可能导致交易失败,并且永远不会包含在一个块中。你的内部数据库必须知道这种情况何时发生,以便它可以通知用户并/或再次尝试。如果你在提交本地转账时没有立即得到错误,那么必须等待交易过期。每笔交易都有一个 “有效期” ,过了这个期限交易就再也不能被实施。一旦这个最后不可逆的块过了有效期,你就可以稳妥地把你这未遂的提现标记为失败,而不用担心在你最不经意时被 “迷之” 实施。

在默认情况下,cleos 设置一个有效期限仅为两分钟的窗口。这个时长足够让所有21个出块者能够确认这个交易。

你的遍历服务可以使用 cleos 来查询最后不可逆的块编号和头块的时间。

交易所安全

本教程提出了一个最低限度可行的存款/提款处理程序,并假设一个包含授权存取款的所有私钥的钱包。注重安全的交易所应该采取以下步骤:

1、将绝大部分资金保留在一个时间延迟,多重签名控制的账户中

2、在多个独立进程/服务器双重检查所有取款的热钱包上使用多重签名

3、部署一个自定义合约,只允许取款到KYC账户,并对白名单账户要求多重签名

4、部署一个只接受来自KYC账户的已知token存款的自定义合约

5、部署一个自定义合约,强制所有提款必须等待24小时

6、利用硬件钱包进行所有签名,即使自动化得取款

客户要求立即提现,但他们也希望交易受到保护。区块链执行24小时让客户知道钱在“路上”,同时也告知潜在黑客,交易所有24小时的时间来撤回未授权的操作。

此外,如果交易所发电子邮件/短信通知用户开始提款,用户有24小时联系交易所并修复任何对他们个人账户未经授权的访问。

有关如何利用这些更高级技术的信息将在后面的文档中提供。

= END =

长按识别下方二维码

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180430G186MM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券