用可易主的私链代替公链解决现有区块链的问题


(刘皇叔) #1

目标有三:

1、高度去中心化,杜绝 51% 攻击;

2、省电,不用 POW;

3、性能可水平扩展,无上限。

本文论述的私链与公链的区别在于:公链是所有人都有权添加区块的,要决定哪个人添加的有效,就需要一套共识算法;而私链只有它的主人有权添加区块,别人只能读,不存在竞争和共识的需要。私链同公链一样运行在公共领域,全人类都可以介入。

通常认为私链不能实现去中心化,因为私链有主人,主人就是中心。此处论述的是可易主的私链,它的主人可以改变。原来的主人向链上添加一个区块,写明将此链送给其他人,链的主人就改变了,此后新主人也可以通过添加区块将此链送给别人。

简单的情况是链上只能添加这一种区块(用于转移所有权的区块),只能由当前的主人添加。则此链在人群中流通时,并无哪个人对之享有长久的特权。当有许多个这样的链并行流通时,每个链各有各的主人,每个人可以拥有若干个链,这些链组成的系统是无中心的。

这样的每一条链,其区块记录着它自身有史以来所有权转移的历史,大家可以看到这根链最初是属于谁,后来给了谁,又给了谁……直到现在。显然,每一个区块的添加者必须是前一个区块里指明的交付对象。

对于每一个链,在任一时刻只有一个人有权添加区块,无须竞争和共识,不用 POW,也不会受到 51%攻击。

没有居于中心位置的公链成为性能瓶颈,故性能可以水平扩展。

如果用于加密货币,可以令每个链代表一张钞票,各有恒定的面值,就像纸钞票一样流通。将货币的支付映射为若干条链的所有权的转移。每根链(钞票)记录了它自身的所有权转移历史,也就是记下了所有的历史账目。这样就实现了高度去中心化、省电和性能水平扩展的加密货币,解决了不可能三角。


(刘皇叔) #2

安全 QA

Q1:用户甲是某条私链的主人,加了一个区块将此链送给用户乙,又加了一个区块将此链送给用户丙,双花得利。

A1:区块加上后需要广播以保证安全,即使支出者不广播接收者也要广播。第一次支付甲或乙广播了,举世皆知,第二次支付甲或丙广播了,大家就会发现甲在同一位置添加了两个区块,构成违规,于是拉黑甲。甲被拉黑后再也无法支付,没有获利。

Q2:接上条,正常操作也可能在同一位置添加两个区块,不能据此认定甲违规。例如甲先加了给乙的区块,但乙没有收到,后来甲又要支付给丙。

A2:在任何情况下都禁止在同一位置添加两个区块。甲加了给乙的区块后,这条链已经不归甲所有,甲不能再加区块。如果由于网络问题乙没收到区块,甲应该重复发送已加的区块给乙。

Q3:接 Q1,丙是甲的同伙(或者马甲),甲支付给丙时二人都不广播,不会被发现。

A3:只要丙要将此链支付给一个正常用户(丁),丁一广播,甲作弊的事就被发现了。而且由于大家没收到甲交给丙时的广播,认为丙高度可疑,可与甲一同制裁。同样地,即使丙又将此链交给别的同谋,无论转送了几手,在最终支付给正常用户时都会被发现。

Q4:接 Q1,区块链网络不完美,可能发生脑裂,如果甲的双花区块分别发到两个子网,而后两个子网断开,就不会被发现。

A4:甲无法如此精准地操作。一旦掌握不准,就面临被拉黑的风险。

Q5:接 Q1,拉黑又怎么样?重新注册账户又是一条好汉。

A5:可要求新账户必须支付一定费用才能激活,构成换账户的成本。也可要求每次支付时账户余额不得小于正在支付的链的面值,被拉黑时账户余额也要损失。而作弊的预期得利只限于正在支付的链的面值。

Q6:接 Q3、Q5,甲正常支付给乙,然后不广播双花支付给同伙丙,在丙支付给正常用户之前先分多次将账户余额花出去,可以减少损失。

A6:丙支付给正常用户时也要预留账户余额,只是把损失从甲转移给丙了。

Q7:接 Q1,在去中心网络里,被拉黑只是不再能与那些拉黑我的节点交易,我还有一班同伙,可以关起门来自己玩。

A7:正常节只想将恶意节点排除出去,才不管你们去干什么。而且,你们恶意节点连不上正常节点了,自己坑自己玩?

Q8:接 Q1,链分叉之后,谁也说不清哪个支链是真的,这条链就废了。

A8:先广播的就是真的。如果两个冲突区块广播时间相近,则接收者立即知道甲在作弊,会拒绝接收,这条链烂在甲的手里。

Q9:接 Q8,我让同伙主张后广播的才是真的,扰乱你们。

A9:正常节点有充分理由认为与自己持不同意见的就是恶意节点,拉黑。或者温柔一点,只是拒绝从恶意节点接收这条有分歧的链。

Q10:接 Q8,我贿赂正常节点,让他们主张后广播的才是真的。

A10:那只不过是新增了一些恶意节点,照 A9 处理。

Q11:接 Q9,对于这条有分歧的链,你拒绝我,我也拒绝你,你的链的流通能力也受损了。

A11:只要正常节点之间的支付不受影响,被恶意节点拒绝不是损失。

Q12:接 Q8,有的用户分叉时不在线,上线时看到其它节点分成两个阵营,不知道哪个对。

A12:可以简单地拒绝接收分叉而又无法选择的链。

Q13:接 Q12,所以双花攻击还是让链的流通能力受损了。

A13:回去看看 A5,怎么算也是攻击者损失的多。


(刘皇叔) #3

用分组方式解决性能问题

在群里有同学提出每次添加区块都需要广播,可能造成带宽和 CPU 压力过大。我计算了一下,如果现在做出加密货币产品并开始推广,推广的速度不太可能抢在硬件发展之前,现有的硬件完全承受得了。

万一发展速度极快呢?可以用分组的方式解决性能问题:

按照私链(钞票)的 ID 的前两个字节分组,将所有钞票分为 65536 个组。每个人只须关注少数几个组的钞票,不需要关注所有钞票。关注每个组的用户组成一个子网络,每次添加区块只须在这个子网络里广播。

支付时,尽量使用自己关注的组里的钞票,保证支付双方有共同关注的组,每个人要与所有经常发生经济往来的他人有共同关注的组,一个人关注十来个组也就够了,这样总的网络传输量、存储空间和CPU只是总量的几千分之一。如果网络规模增长得更大,可以将组分得更细一些。

对组的关注是动态的,用户随时可以关注一上新组,只是需要一段时间读取组内的数据。

另外还可以有一些全局的组,所有人都关注。这个组里的钞票数量可能不太够用,只有在支付双方完全没有共同组可用的情况下才用到全局组的钞票。


(btcholder) #4

有点意思
看的有点迷


(刘皇叔) #5

哪里不清楚尽管提问。也可以到 QQ 群里来问:730692290。


(夜の乐) #6

有些地方想到一起了,哈哈


(刘皇叔) #7

新版文档在此