交易中心的比特币账户(地址)管理机制探讨

本文只是理论推导。实际交易中心的程序,也许有更好的方法;也许交易中心偷懒,省略了一些步骤。

首先列出交易中心比特币账户管理的几个目标:

1 自动化。自动化是一切的前提。一旦人工介入,必然成本暴增、速度暴降、错误暴多。

2 充值提现快速。这是竞争的必须。比特币转账本身就需要20-60分钟,所以交易中心必须要尽量的快。

3  安全。安全原本是最重要的,但是由于竞争和盈利需要,只能放第三位。或者说,交易中心技术再安全,如果人不安全,都白扯。

4 保密。说好听的是为客户保密,说一般听的是技术保密,说难听的是为做坏事保密。

6 方便客户。比特币地址本来就是一堆乱码,尽量减少客户复制粘贴这些乱码,会方便客户,也减少客户出错的可能。

下面开始推导。

交易中心的比特币账户,是一个开环:由用户充值起,至用户提币止。中间有一系列的操作。那我们就从两头向中间推导。

1充值:

首先,交易中心必须向用户提供一个充值地址,这样用户才能充值。由于比特币钱包的设计特点决定,用户无法知道他的发出比特币的地址(而且往往是多个),所以确认充值的用户身份,只能通过充值地址。

有2种方法:静态充值地址和动态充值地址。

静态充值地址:为每个客户生成一个充值地址,长期不变。

动态充值地址:为每次充值生产一个一次性充值地址,用完作废。这个方法有很大的问题:问题(1),如果客户不小心用了以前的充值地址,系统无法自动收到,需要人工干预。与目标1自动化不符。问题(2)如果客户从2个或以上的钱包向交易中心充值,由于要等上一次充值成功后才可以知道下一次充值的地址,所以要等待充值成功,而充值成功需要30-60分钟,这样严重影响目标2充值速度。问题(3)客户每次都需要复制粘贴地址,有可能出错误,影响目标6方便客户。问题(4)数据库会比较庞大,出BUG不好处理,影响目标3安全。唯一有益的是目标4保密。

所以,作为结论,应当使用静态充值地址。

 比特币的账目透明性,给交易中心的管理带来了极大的好处。只要充值账户数据库备份好,随时都可以查清每个客户存了多少币,不会在这个环节发生不必要的损失。

 2提现:

提现必须要用户提供一个地址,交易中心才能发过去。提现地址用户每次可以自由设定。

由于比特币的找零机制,所以交易中心的提现发送地址,平均每半小时才可以执行一次提现。(如果是多个地址发送,则效率更低)

所以,提现发送地址的数量,应至少不少于每半小时的提现次数。这是一个动态的数值,随着交易中心的客户数量而变化。而且有时间分布差异,根据交易中心对应的客户群,夜间提现少,白天提现多。 为了防止提现延迟,应尽量多准备提现发送地址。

提现发送地址的另外一个重要考虑因素,是各个地址内的比特币数量分布。完全均匀分布肯定是不行的。例如有100个账户,每个存1个比特币。如果发生99个0.1比特币的提现,就会占用99个地址,也占用了99个比特币,那么如果第100个提现要提10个比特币,交易中心就给不出来了。解决方法:各个地址内的比特币数量分布,要与既往的提币数量分布进行尽量精确的对应。对应的越好,需要的提币账户就越少,提币账户里需要准备的比特币就越少,放入冷储存的比特币就越多,目标4安全性就越高。这里涉及到数学模型的建立。所以说,写个交易中心程序不容易,光有好程序员还不够的。

通过备份用户的提现账户数据库,可以随时从比特币网络上查清每个用户实际收到了多少提币数量,防止程序错误导致多次支付,给交易中心带来损失。

更安全的考虑,可以为每个用户设立一个提现专用账户,提现时,先把提现的币转入专用账户,然后再从专用账户转出。这样只要备份了提现专用账户数据库,以后可以在比特币网络上随时查清所有用户的提现记录,防止一旦重复提现后,交易中心出现损失。这个方法的缺点是,需要进行2次转账,这样提现时间就延长到了1个小时。

 3存量:

交易中心一旦开起来,一定有一笔存量比特币放在交易中心。存量的来源:(1)挂单的币(2)交易完成到提币的时间差带来的存量(3)没有钱包的人,把币直接放在交易中心。

从MT事件看,存量币的数量是极其惊人的。MT存量75万个,而日交易量只在3000-5万个,所以存量是日交易量的15-250倍。如果考虑到提现周期只需要30分钟,存量将是活动币量的750-12500倍。

于是,存量币面临巨大的安全问题。存量币如果被盗或自己弄丢,将是毁灭性的。Poloniex被盗了13%的币,说明其存量币管理机制存在巨大的问题,当然也可能是坚守自盗。

比特币由于其非中心性,最大的安全问题就在这里。中心性的货币,除非中央服务器被毁,否则钱被盗了,能追回来;密码忘了,可以用身份认证修复。而比特币一旦出问题,就万劫不复。

存量币的安全问题的解决方案,是冷钱包,或者说冷账户。所谓“冷”,是指服务器中不存储该账户的私钥,该账户的币,需要手工输入私钥才能转出。

冷钱包的使用方法是,找一台不联网的计算机,生成账户(私钥公钥对、由公钥导出的地址)(私钥加不加密码不重要了)。将私钥抄好(这时纸作为模拟介质比U盘等数字介质要安全得多)。进行测试:按照私钥算出地址,打一些币进该地址,然后再用私钥签名(注意签名时是离线的,签名后的数据包再拷贝给联网的钱包),看是否发送成功。如果测试成功,说明该账户信息正确。将该账户的地址交给服务器,以后需要冷存储的币,就转入这个地址里。由于服务里没有该地址的私钥,所以黑客无法偷走币。也不用担心服务器故障把私钥弄丢。将该账户的私钥信息存入保险柜。保险柜需要多人同时在的时候才可以开启。

在此基础上,有一个更安全的方法:比特币提供了多私钥账户功能,一个账户可以有3个私钥,至少用2个签名才可以转出比特币。这会进一步提高冷存储的安全。因为如果只有一个私钥,脑子好的人可以在生成和测试私钥时把它背下来,将来就可以独自把里面的币偷走;或者开启保险箱后私钥被损坏,导致币全部丢失。而如果有3个私钥,互相不见面,这种可能性就没有了。比如CEO一个私钥,财务总监一个私钥,独立董事一个私钥,这样会安全很多。当然,如果政府介入监管,则交易中心一个私钥,政府监管部门一个私钥,第三方公正机构一个私钥,就更加安全。

笔者觉得以上方法仍然不够安全,期待有更安全的方法出现吧。

4 充值-提币通路

由于冷存储需要人工参与,所以应当尽量少动用冷储存的币。无论充值的币是否多于提现的币,都应该用充值的币优先供给提现的币。

最简单的方案,就是把充值的币,直接打给提币的账户。即 用户充值账户->交易中心接受充值账户->用户提币账户

我们基本可以假设,充值的次数和提币的次数是接近的,充值的币数量分布和提现的币数量分布是接近的。

交易中心需要设置属于自己的找零账户,否则找零如果打给充值账户,会误以为是二次充值,给交易中心带来损失。

所以,在提币时,只要找到数量最接近的充值账户,转出,余额转到找零账户就可以了。必要时可以多个账户转到一个账户。

但是,“缺点”是,这样交易中心就变成透明的了。不过笔者不认为这是缺点,如果交易中心更透明一些,把所有的充值账户、提币账户都公开(仍然是匿名的),则用户更有安全感,反倒会吸引更多用户。

有的交易中心,建立了“中间整理账户”,把充值账户里的币,凑成整数转移到自建的账户里。笔者认为是完全多余的。反倒是这种行为特性的地址,一眼就可以识别出是交易中心的地址。还有,这些转账也产生手续费,聚沙成塔,是交易中心不小的一笔支出。

有的交易中心,为了所谓“保密”,创建一大堆地址,变着法的将充值的币折腾来折腾去,以使外人搞不清币的真实去向。这种做法,肯定心怀叵测。

5 充值-存量通路

 在交易中心成立初期,或者经营的好的话,币会越来越多,所以需要有充值的币转入存量。

这个通路非常好设计,定时(如1天)进行一次处理,如果热账户的里的币数量超过了预设比例,超出部分,选剩余数量大的地址,直接转入冷钱包即可。

为了保证最高的安全性,冷钱包应该有多个,存储币的数量应当尽量平均。

有的交易中心,又考虑所谓“保密”,尽量不想让外人知道他的冷钱包,所以在转入冷钱包之前又是好一顿折腾。

笔者认为,无论是否有监管,交易中心都应该公布冷钱包地址,以使用户放心。

6 存量-提现通路 

 出现大额提币,或者交易中心经营走下坡路时,会出现入不敷出,需要动用冷储存的币来支持提现。

 冷储存账户由于其安全特性,一个账户只能转出一次。一般冷存储账户内的数量都较大。转出后,需要有一个分散机制,按照提币的数量分布,对应比例地分散到若干个账户里。

 有的交易中心,又考虑所谓“保密”,又是好一顿折腾。评价同上。

 

以上,希望对于交易中心程序员来说,都是“废话”。如果有不是废话的,希望能够参考。