gate.io

  • 涨跌幅起始时间
    主题模式
    亮色
    传统黑
    暗黑色
    • 简体中文
    • 한국어
    • English
    • Tiếng Việt
    • 繁体中文
    • Español
    • Русский язык
    • Français
    • Deutsch
    • Italiano
    • Português
    • ภาษาไทย
    • Indonesia
    • Türkçe

Gate.io保证金证明

本文介绍了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.gate.io/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.