Gate.io保证金证明
本文介绍了GATE平台保证金证明审计的相关流程,背景和指南,以期安全透明地向用户证明Gate为用户提供100%的保证金。
本文介绍了GATE平台保证金证明审计的相关流程,背景和指南,以期安全透明地向用户证明Gate为用户提供100%的保证金。
日期 | 审计公司 | 货币 | 报告 | 网站 | 状态 |
---|---|---|---|---|---|
2020年5月11日 | Armanino LLP | 比特币 | Gate.io储量证明评估报告[BTC] [2020年5月25日] | 信任浏览器-储户证明 | 已发行 |
一直以来,用户都想要了解并确认交易所确实100%保存有他们存入的资金,而保证金公开透明也就成了虚拟币交易所需要解决首要问题之一。为此,Gate提出了利用默克尔树(Merkle tree)+第三方审计的方案,用户可以验证他们的资产确实100%存放在Gate中。为此,GATE还聘请了一家独立的虚拟币核算审计公司来帮助进行审计。
审计员通过Gate提供的用户余额生成哈希树
Gate向审计员提供详细的用户余额(基于token的),审计员将用户余额导入到generator.html中生成一个默克尔树。如下所示:
审计员验证总用户余额,并发布默克尔树以及根哈希
当generator.html成功生成默克尔树后,它的根哈希和用户计数以及总的用户余额会被计算出来,并显示给审计员进行验证。
默克尔树的叶子则保存为文本文件,在Github上共享给所有的用户,这样用户就可以验证自己的账号余额了。
用户独立验证自己的账号余额
首先,用户需要从Github上获取发布的默克尔树,并将其导入到verifier.html中,然后输入自己的加密用户ID(hashed UID)以及token的余额来触发验证流程。加密用户ID可去此页面获取:https://www.gateio.tv/myaccount/myavailableproof如果用户提供的加密UID和余额和默克尔树中的记录一致,则会返回成功结果,并显示用户信息在默克尔树中的节点位置。使用导入的文件,默克尔树根哈希会重新进行计算,这样用户可以验证此根哈希,确保默克尔树的正确和完整。
什么是哈希树?
在加密学和计算机科学中,哈希树(或默克尔树)是一种树形数据结构,每一片叶节点使用数据块加密哈希作为标签。每一个非叶节点使用其子节点的标签的哈希作为标签。哈希树能够安全有效地验证大型数据结构的内容。
如何使用用户的加密UID和余额构建默克尔树?
首先,从Gate的数据库中导出加密UID和相应的用户余额。每对加密UID和用户余额会分别进行哈希处理,然后联结形成底层数据块。对于每个数据块,使用相同的哈希函数来生成默克尔树的叶节点。得到的加密数据会随后成对在一起进行哈希处理,创建出叶节点的父节点。这个过程持续进行,直到得出单个哈希数据,即默克尔根。如下方图表所示。默克尔树成功构建后,叶节点会被导出为文本文件,然后同默克尔根哈希一起,被审计员发布出来。
使用默克尔证明来验证加密用户ID和余额
为了验证输入的加密用户ID和余额,我们需要构建一个默克尔证明来验证默克尔树中存在这个数据。
默克尔证明是通过对加密UID和用户余额的连接进行哈希处理构建的,可以往上追溯直到获取根哈希,而根哈希已经在步骤2中由审计员发布。
以下例子中解释了默克尔证明是如何工作的。
为了验证用户输入的数据(UID,余额)存在于在默克尔树根中,我们使用单方向函数来哈希处理UID和余额加密值,获取数据K。然后,在数据K上使用相同的哈希函数,获取数据H(K),记作K'。要验证是否含有K,不需要透漏K,同样地,数据A的哈希也可以使用这种方式透漏,而且不会带来任何的安全隐患。
计算步骤如下:
K'对未知数据组A的哈希进行哈希处理,产生A'K',即H(A'+K')
A'K'使用C'D'进行哈希处理,导出根,H(A'K'+C'D')
对H(A'K'+C'D')的值和已经发布的默克尔根哈希进行对比
这样,我们可以验证用户输入的数据(加密UID和余额)是否存在于默克尔树中,而无需泄露任何其他 用户的ID和余额。
安装依赖包
npm install
安装build工具
npm install -g browserify watchify
创建bundle.js确保可以在浏览器中运行
browserify app.js -o bundle.js
要获取bundle.js的自动构建,如下所示使用watchify,或者使用nohup让watchify命令在后台运行
nohup watchify app.js -o bundle.js -v > nohup.out 2>&1
浏览器中打开 generator.html导入有UID和余额的文件构建默克尔树
浏览器中打开 verifier.html,校验UID和余额组合。
app.js 构建Merkle树和执行验证的核心逻辑
最上面的js函数处理js代码和HTML的交互,通过HTML事件收到用户的操作,如上传原始用户余额,创建默克尔树,上传默克尔树并验证用户余额,处理用户输入,然后传送给对应的函数进行进一步处理。
函数 bufferToString() 负责将字符串转换成十六进制格式。默克尔树节点值虽然是从缓存中获取到,但是都是二进制的格式。
函数 createMerkle() 执行以下四项工作:
读取从Gate的数据库中导出的文本格式文件中提供的加密用户ID和用户余额。
然后分别对每对加密用户id和相应的余额对进行哈希处理(在我们的代码中使用的是SHA256算法),连接,然后再进行哈希处理,形成默克尔树的叶节点,为了降低空间使用以及输出文件的大小,仅仅保留加密值的前16位。之后,对每对叶节点进行哈希处理和连接,形成他们的父节点。继续进行这个过程,直到仅剩下一个父节点(即根节点)。
计算总的用户余额和默克尔树的根哈希,显示在generator.html中。
将默克尔树中所有的叶节点保存在文本文件中,用于日后用户和审计员进行验证。
函数 verifyMerkle() 进行以下两种校验工作:
校验提供的加密UID和用户余额是否能在默克尔树的叶节点中找到。验证的第一步是计算出提供的加密UID和用户余额进行哈希处理后的值,然后再从createMerkle()function保存的叶节点中查找这个值。
只有第一步成功后,才可验证createMerkle()函数生成的默克尔树中是否有这个加密值。验证是通过merkletreejs中提供的库api verify()进行的。
FileSaver.js 保存文件的插件
generator.html html页面,用于构建默克尔树和计算默克尔根哈希
verifier.html html页面,用于校验加密用户ID和用户余额
package.json 装有各种项目相关的元数据,并用于处理项目的依赖包
版权所有©Gate Technology Inc.. 保留所有权利
Licensed under the GPLv3 license.