之前已经写好了send raw transaction的模块,链上操作就复用之前写好的代码,本篇主要描述提币的链下逻辑。
按步骤来:
1. 提币从用户发起请求开始,后端收到请求创建一个待确认提币请求记录,发送验证信息给用户,等待确认;
2. 用户收到确认信息,确认状态发回后端,后端通过确认状态,标记对应提币请求记录为已确认,加入到提币请求队列;
3. 定时任务给提币队列里的记录转账,返回的tx hash写入对应的记录里,并标记打包中,加入到打包队列;
4. 定时任务检查打包队列里的记录,通过tx获取transaction状态,
json = $eth_client.get_transaction_receipt tx
这里返回的json,如果json["result"]返回nil,表示这条transaction还没被以太坊网络处理;返回了result = json["result"],result["blockNumber"].to_i(16) > 0表示已经写入链上的节点编号;result["status"].to_i(16) == 1表示交易正常,否则交易失败,失败的交易不会扣余额,但是已经用掉的gas不会被退回;如果需要记录确认数,这里只能用获取当前区块链高度的接口($eth_client.block_number["result"].to_i(16)),减去result["blockNumber"]。
第4步结束,每条记录都会得到对应的状态,再写个处理失败记录的脚本进行容错,提币的模块就写好了,做起来是没什么难度的,逻辑也比较简单。至于交易所里下单,结算等交易逻辑,目前互联网里的经验很丰富了,我的解决方案估计说出来也挺low的,没什么价值,就不写成博客了。至此,一个支持交易ETH的交易所就可以运行了,下一篇会写关于ERC20的充值提币。