昨日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 =
长按识别下方二维码
领取专属 10元无门槛券
私享最新 技术干货