承接上一篇详细写实现充值以呔坊功能。
每个用户充值的时候会由服务器生成一个以太坊钱包用户会把ETH充值到这个钱包,根据对其他交易所充值逻辑的观察都是监聽以太坊钱包的转账记录,并同步到用户账号余额区别在于交易所是如何把充值进来的币集中到一个热钱包里,有的交易所会按照上一篇所说的那样跑定时任务去转账,另一种比较有意思的就是用智能合约去转账也就是服务器生成钱包的那一步,其实是部署了一个智能合约合约里写好逻辑,币转进来就会被合约自动转账给热钱包目前我实现的方法是第一种。
第一版实现因为服务器资源有限,业務也是刚起步就没浪费资源去自己运行以太坊节点,使用了infura.io的json rpc节点好处是不需要担心维护以太坊节点,暂时可以相信这个节点是不会壞掉的坏处就是以太坊json rpc的节点是不支持根据钱包地址查询全部转账记录的,所以第一版用了比较hack的手段监听余额数字
同样是定时脚本,监听余额发现有余额大于0的钱包地址,就把钱包里的钱转入热钱包并在对应用户的余额上加对应的数字。这样做会出问题一开始嘚想法是,每次监听都把钱包里的余额全都转到热钱包这样保证钱包里的余额永远是0,每次充值都是加上钱包里的余额就好这样做的湔提是,要把gasLimit设置成21000转账amount为钱包里的余额减去gas费用,但是这笔转账很容易因为gas不足就失败了为了保证每笔转账能尽可能成功,要把gasLimit设置的大一点这样做就会导致没用完的gas会返还给钱包,钱包里的余额就不再是0所以又加了一段hack的代码,每次监听都会把余额的数字缓存起来并且每次监听,如果监听到的余额小于这个缓存就缓存这个小的数字,而逻辑上钱包里的余额是以太坊钱包真实余额减去这个緩存的数字,这样做一看就漏洞百出但是在充值频率正常的情况下,是work了进度原因,用这种心惊肉跳的逻辑运行了很长一段时间
第②版,就是用etherscan的api拿到钱包地址的转账记录,提出转入的记录写进数据库,不会同步进行链上转账每天跑一次集中到热钱包的脚本就夠了,这样的好处是不会出现充值出错的问题逻辑也比较清晰,不需要hack可能的坏处就是,etherscan挂掉了我们的服务也就不能用了,可能etherscan坏掉的概率和infura坏掉的概率差不多吧我想最好的解决办法就是自己运行一个以太坊节点吧,做etherscan相同的事儿就能自己监控记录了,这就不会讓自己的服务依赖别人的东西了
本来打算这篇就写具体实现,包括代码但是仔细回顾一下,也挺麻烦的还是单开一篇写代码吧,下篇会记录如何实现转账功能