转自:http://blog.bifubao.com/2014/03/16/proof-of-reserves/

100%准备金证明

什么是准备金

说白了,准备金就是平台留存的钱。100%准备金率就是用户存100块,平台必须保留100块;10%就是存100块,平台可以只保留10块,另外的90块可以做别的事情,通常银行通过放贷等进行盈利,所以银行需要拼命吸储。

为何Off-Chain钱包需要证明

Off-Chain(链下)机制是用户的币在平台只做登记,币由平台完全控制。On-Chain(链上)机制是用户的币由自己通过私钥管理,平台无法动用。所以,只有Off-Chain才有可能低于100%准备金且需要证明,On-Chain总是保持100%准备金率。

证明机制

最简单的证明方法就是公布所有用户数据,平台的准备金率即:平台储蓄地址 / 用户总余额。该方式很直接,但易伪造。

欲保障逻辑完备性,需要证明:

  1. 没有伪造

    1. 伪造假用户
    2. 伪造用户余额
  2. 没有遗漏
    1. 直接遗漏用户:某个用户在公布的数据里找不到自己
    2. 间接遗漏用户:两个或两个以上用户对应的是同一条数据

先说伪造,伪造假用户的结果是:准备金率下降,打自己耳光;伪造用户余额的结果是:任一用户发现余额与公布的不一致即说明平台造假。还有一种就是仅伪造平台控制的用户数据(自己人的账户),若往多了吹,造成准备金率下降;若往少了说,没意义。但无法防止的情形是:伪造大量的零余额的用户,但这个不影响准备金率。

第二个点是遗漏,直接遗漏也没法弄,一旦某用户发现找不到自己则立即露馅;通常是间接遗漏,防止间接遗漏最直接的方法是公布用户Email地址,但会暴露用户隐私,通常需要设计一个Hash算法,例如:hash_value = HASH(user_id + nonce + balance),user_id这个字段必须每个用户唯一且固定不变,通常是选择email或者手机号码,因为天然具有唯一性且不可伪造。确定HASH算法后,用户的识别由Email地址改为hash_value。

证明方法

证明主要过程是构建Merkle Tree,当构建完该树,且根节点的余额与公布的储蓄地址余额相同,即可100%储备。证明算法参考了Proving Your Bitcoin Reserves,少许修改。

构建的树结构

单个用户看到的结构

隐私问题

用户

必须在证明的同时可以保障用户财务隐私不被泄露。

  1. user_id的选取,上文已阐述,不再重复
  2. 每次构建时,用户的Nonce均为随机,即使用户两次余额不发生变化,hash_value依然是不一样的

上述两点可最大限度保护用户财务隐私,虽然别人可能看到你的节点数据,但他不知道你是谁。

平台

对平台来说,敏感的数据是:总储蓄额,总用户数。

总储蓄额必然公开,无需讨论。总用户数若不想那么公开,可以通过一些方法掩饰。通常Merkle Tree是平衡二叉树,根据用户树的高度可以推测用户数量(误差在2倍以内),那么就可以通过构建非常不平衡的二叉树(每次可以是任意形状)来掩饰平衡构建树的真实高度,且不破坏验证机制。例如,平衡二叉树的高度为10,则平台用户数范围是:512~1024之间(2^9=512, 2^10=1024),若构建一个高度为20的非平衡树(2^20=1048576)就可以成功掩饰实际用户数。

其他保护平台隐私方法:

  1. 降低公开频率,例如从每天公开一次降低为每周、每月公开一次
  2. 利用自有资金进出,干扰资金流向跟踪

币付宝的证明机制

我们理念是保护用户隐私的情况下,公开所有平台数据:总储蓄额、总用户数,用户可以下载所有节点数据。构建满平衡二叉树的过程是:构建用户节点 -> 迭代向上构建父节点 -> 至根节点,树构建完毕。若某一层节点数为奇数,则将最后一个节点复制,该节点称为填充节点(padding node)。

示例用户数据

User Email/ Mobile Phone Nonce Balance (Satoshi)
panzhibiao@bifubao.com 139853 100047062
support@bifubao.com 982361 88086042
13800138000 093823 3343103669

用户节点

用户节点hash值的算法:

1
2
3
4
5
hexstr(first8bytes(sha256(str(user_id) + sprintf("%06d", nonce) + sprintf("%016lld", balance)))
)

构建一个用户节点,由于字符串直接拼接,我们把user_idnonce合成为下面函数中的uid示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct Node_ {long long         sum;unsigned char hash[8];bool operator < (const struct Node_ &right) const {return memcmp(this->hash, right.hash, 8) < 0 ? true : false;}
} Node;// make_user_node
void make_user_node(const char *uid, long long balance, Node *node) {unsigned char hash[SHA256_DIGEST_LENGTH];char buf[17] = {0};node->sum = balance;sprintf(buf, "%016lld", balance);SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, uid, strlen(uid));SHA256_Update(&sha256, buf, 16);SHA256_Final(hash, &sha256);memcpy(node->hash, hash, 8);
}

用户节点都创建完毕后,按照hash值进行排序。

父节点Hash值计算函数

将两两相邻的节点进行汇总,得到父节点,若当前层的节点数为奇数,则将最后一个节点复制,补充为偶数。

父节点的余额为左子节点与右子节点之和,父节点hash值算法:

1
2
3
4
5
hexstr(first8bytes(sha256(_8bytes(left.sum + right.sum) + _8bytes(left.hash) + _8bytes(right.hash)))
)

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
// make_parent_node
void make_parent_node(const Node *l, const Node *r, Node *p) {unsigned char hash[SHA256_DIGEST_LENGTH];unsigned char buf[24]= {0};p->sum = l->sum + r->sum;memcpy(buf,    (unsigned char *)&(p->sum),  8);memcpy(buf+8,  (unsigned char *)l->hash, 8);memcpy(buf+16, (unsigned char *)r->hash, 8);SHA256(buf, 24, hash);memcpy(p->hash, hash, 8);
}

Merkle Tree

构建Merkle Tree的过程,即向上递归两两合成父节点,至该层节点数为1时停止。

冷钱包地址

  1. 1PufBJk2c2HYq5wNap9yjmjSw6G3iD6mr5
  2. 1EQvpVvPVtZrwwrSoXY1mMrdVuCqaiVKEy

地址签名

1
2
3
4
5
6
7
8
# plain text
this address belongs to bifubao.com, 2014-03-04# signature of 1PufBJk2c2HYq5wNap9yjmjSw6G3iD6mr5
HGcRqoJUq3iINmQ1jCA59KD6Iv0DzcaQxxtkIL9l/+wWo1bREPmh3h35IowYv0DU7lRT54O2wQtQ2rE7AVUxiVk=# signature of 1EQvpVvPVtZrwwrSoXY1mMrdVuCqaiVKEy
G/AMpYGw6aW2gLHdHwkCh+PIHz6gwybXEostNCSmF8RBzEwAOYUFNBD5oI6XFkLRGvFrs58KRP/7Ok9GATZONW0=

数据与源码

  1. 构建树源码:https://github.com/bifubao/proof_of_reserves

示例树结构

参考

  1. prove-how-(non)-fractional-your-Bitcoin-reserves-are schemehttps://iwilcox.me.uk/2014/nofrac-orig
  2. Proving Your Bitcoin Reserveshttps://iwilcox.me.uk/2014/proving-bitcoin-reserves
  3. 图片来自:参考2中的网页

Merkle Tree用于100%准备金证明相关推荐

  1. Merkle Tree 实现细节及(不)存在性证明

    Merkle Tree in BitCoin & BitCoin Cash Merkel Tree是Bitcoin的核心组件,其相关资料已经非常丰富,所以本文档偏重于介绍Merkle Tree ...

  2. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  3. 区块链六-Merkle Tree

    2019独角兽企业重金招聘Python工程师标准>>> 基于Java语言构建区块链(六)-- 交易(Merkle Tree) Posted on 2018-03-26 |  In b ...

  4. 理解区块链背后的Merkle Tree

    你可以在Github上获取最新的源代码(C#) 目录 简介 本文中的术语 Merkle Tree被应用在哪里? 数字货币 全球供应链 保健行业 资本市场 Git 和 Mercurial 为什么使用Me ...

  5. 区块链与merkle tree

    Merkle Tree Merkle Tree 是由计算机科学家 Ralph Merkle 在很多年前提出的,并以他本人的名字来命名.通常也被称作Hash Tree,就是存储hash值的一棵树.Mer ...

  6. Merkle DAG 和 Merkle Tree的区别

    Merkle DAG 和 Merkle Tree的区别 对于IPFS,Merkle DAG 和 Merkle Tree是两个很重要的概念. Merkle DAG是IPFS的存储对象的数据结构, Mer ...

  7. Merkle Tree(梅克尔树)算法解析

    Merkle Tree概念   Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...

  8. 七、区块链如何运用merkle tree验证交易真实性

    转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证. Merkle Tre ...

  9. layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性

    大部分材料都会提到区块中保存了merkle根,并且利用它作交易真实性验证.但是具体如何作这个真实性验证,没有一篇文章可以通俗的讲出来.本文假设你已经知道区块链中merkle tree的原理,现在想搞明 ...

最新文章

  1. C++学习笔记24,方法重写与方法隐藏
  2. springmvc开启事务_java面试题 一 :SpringMvc的流程
  3. python中静态变量和静态方法_【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)...
  4. python3项目-把项目从Python2.x移植到Python3.x的经验总结
  5. listview嵌套gridview
  6. 有意思的记录-shell(持续更新)
  7. 【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用
  8. feign 整合sentinel_SpringCloud实战五-Sentinel上
  9. CVPR 2019 行人检测新思路:高级语义特征检测取得精度新突破
  10. 从LeNet到AlexNet
  11. exe msdt 无法上网_软网推荐:可装EXE程序的ReactOS
  12. SAP License:物料账差异
  13. Android开发笔记(十三)视图绘制的几个方法
  14. 简述div标签和span标签的不同_div与span的区别是什么?
  15. keeplive安装部署
  16. matlab 符号函数是什么意思,matlab符号函数定义
  17. Imu_heading源码阅读(一)——common.h
  18. Office 365系列之十三:Office 365管理员角色
  19. java中boot是什么,Spring boot是什么
  20. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...

热门文章

  1. 使用pdfbox将pdf转换成图片的时候,STSong-Light字体不存在解决方案
  2. 常用的RFID卡 14443A/B, 15693
  3. 名悦集团:4S店汽车保养有哪些需避开的小雷区
  4. 打印机故障检测(CANON)
  5. 深度强化学习控制六足机器人移动个人学习笔记(一)
  6. c语言将结构体存储在数组中,结构体数组方法用法 _C语言-w3school教程
  7. Codeforces 1198F
  8. 股票下单软件接口的设计原则是什么?
  9. 六年级下册计算机电子板报教案,六年级下信息技术教案电子报刊设计河大版.doc...
  10. XShell 还是 FinalShell?