来源 | 王剑的角度 国信证券经济研究所 金融业首席分析师
作者 | 王剑
本文共8640字,预计阅读时间:22分钟
认识信用货币
我们的故事从信用货币说起。
信用货币的本质是“债权”、“欠条”。这张欠条有一个发行人,这位发行人就是债务人,他签发了这张欠条。他欠着这张欠条的持有人一笔钱,持有人就是债权人。欠条上记着数字,代表着所欠的金额。持有欠条的人(此处称之为“买家”),拿这张欠条去买东西,支付给卖家,并从卖家那拿走商品。于是,这位卖家成为了新的债权人。也就是说,买家向卖家买东西,要支付对应的价值,而这笔价值是用债权来充当的。换言之,买家支付给卖家货币,本质是支付给卖家那笔债权。
卖家之所以接受这样的支付,是因为他也信任那位发行人。如果他不信任那位发行人,他就要求买家拿相近价值的东西来支付,比如其他商品。如果这种用来交换的商品是被普遍接受用来支付的,那么就被称为一般等价物。
因此,现代人们对货币的认识,并不是一般等价物演进成信用货币。而是,货币大部分时候都是信用货币,就是记账,大家签发各种欠条用来记账,有一个大家都信得过的记账系统。一般等价物只是在缺乏大家信得过的记账系统时的权宜之计,比如双方没有足够信任的跨部落(后来变成跨国)交易。
既然货币就是信用货币,就是欠条,那么就有一个用什么材料来记载这笔债权的问题。人类使用过金属(非足值的金属币是信用货币)、贝壳,而目前主流是印刷着数字的纸,就是纸币。现代纸币一般由政府统一发行,即由政府来充当那个中心的发行人,即债务人。当然,大部分国家由代表政府的中央银行来承担实际发行人角色。
以纸币为代表的现代信用货币有几个特点:
(1)匿名性:这些欠条是不记名的,上面不会写着持有人的名字,因为流通很快,要随手支付出去。纸币上面一般会有序列号,有某些情况下能追溯这张纸币的流转(比如ATM、交易柜台可记录序列号),但大多时候很难轻易实现,因此交易匿名。
(2)便捷性和低廉性:携带方便,生产成本较低(其实有些国家的纸币运用了复杂的防伪技术,成本并不低),纸币本身几乎没什么价值可言。金属币的信用货币有一点点价值,就是那点金属的价值,但远低于其票面金额。
(3)真实性:需要复杂的防伪技术,防止被随意复制,并且有技术要验证其真伪。
这就是以纸币为代表的现代信用货币。
银行存款货币
此外,我们常用的还有一种“货币”,就是银行存款,有时被称为银行货币。这种货币不是我们今天讨论的真正意义的货币,而是把一笔货币存在银行的凭证,据此凭证可以从银行提取真正意义的货币。比如,我国《人民币管理条例》规定:“本条例所称人民币,是指中国人民银行依法发行的货币,包括纸币和硬币。”没说包括存款货币。也就是说,人民币具有法定偿付功能(境内任何人不得拒收),其中主币(一元以上币种)具有无限法偿(指任何交易情况下不得拒收。但辅币没有无限法偿,只有有限法偿,有些情况下可以拒收,比如有人背着几麻袋的五毛钢镚来买一辆车,则可以拒绝。但买家背着几麻袋的1元钱来买一辆车,则卖家不能拒绝,只能老老实实蹲下来数钱),但银行存款不是人民币本身,也没有法偿功能,买家不想收时就可以拒绝(理由可能包括他没有银行账户,或者他觉得银行马上要*了),而要求对方只能用纸币或硬币支付。因此,严格地讲,银行存款不是法定货币本身,而是能够问银行提供法定货币的凭证。我们后续的讨论仅限于法定货币本身。
顺便说一句,《人民币管理条例》可以修订了,人民币应包括纸币、硬币和数字货币。但数字货币只能具有有限法偿,因为卖家如果不具有数字钱包时,不能强迫他去准备一个数字钱包。
货币的数字化
随着现代信息技术发展,人类的很多资讯开始以信息化、数字化的形式存储、传送,方便快捷。于是,人们开始考虑这么一个事情:既然信用货币本质是债权、是欠条,因此它不像一般等价物那样是实物,而是一条信息,那么它能不能也用现代信息技术给予信息化、数字化呢?
其实,要用数字信号代表一笔欠条,似乎是很容易实现的,这就是“数字货币”,过去叫“电子货币”。但是,要让这笔数字货币真正履行货币的功能,那么它还要和纸币一样实现几个特点:
(1)匿名性:作为一个数字信号,数字货币在被付来付去的时候,是很容易留痕的。它不像纸币,买卖双方在线下直接交付,不留痕迹。因此,如何实现匿名性,成为了一个问题。
(2)真实性:作为一个数字信号,数字货币会不会很容易被Ctrl C、Ctrl V?要是无限复制,就出来了假币。而且,这个和假纸币还不一样,假纸币至少还能用验钞机查验,数字货币要是直接用复制、粘贴,那么被复制出来的那一份和原来的那一份是一模一样的,你都不能说它是“假的”。所以,数字货币要加载一套复杂的加密技术。
(3)便捷性:携带和交付比较方便。作为数字信号,传送肯定是很方便的,但是,由于加载了一套复杂的加密技术,有可能会导致交易过程略复杂。同时,数字信号不能像纸币一样拿在手上,只能存储在电子设备中,因此人们需要持有这种设备,我们将存储数字货币的电子设备叫做数字钱包。
(4)廉价性:货币是人们经济生活的基础设施,不能成本太高。数字货币不像纸币,每印刷一张都有成本,只要建好整个体系,新发行数字货币时边际成本几乎可忽略不计。但是,建整套系统(包括居民所需的数字钱包设备)可能需要较高成本。
(5)安全性:就是最好不容易被盗、丢失、毁损等。这个问题没有完美答案,只要是货币,不管是硬币、纸币还是数字货币,都不可能100%消除这一风险。我们只能说,数字货币只要比纸币更安全,那就是进步了。
后三个特点不难理解,我们不展开。
重点在前两个特点。前两个问题其实是相互对立的:要保证真实性,防止数字货币被复制出来后用于多次支付(称为“双付”问题,即复制了一份后,可以用于两次支付了),最简单粗暴的办法就是让数字货币惟一记名,由发行人一直盯着这笔数字货币的流转(这还需要联网,也影响了便捷性)。但这样就无法实现匿名性。因此,这似乎是不可调和的矛盾。
我们今天专门介绍下,一些数学天才是如何用精美的数学方法来解决前面两个问题(匿名性、真实性)以及去中心化问题。所以,实现数字货币的并不是新神器的发明创造,而只是数字方法的巧妙应用。
盲签与零知识证明
信用货币要求具有匿名性,不可追溯,但又得保证其真实性,不被非法复制,这是一对矛盾。
匿名性是指,数字货币的使用者在交易时支出了一笔数字货币,这笔数字货币在市面上流来流去,最终所有人都不能看到它经了谁的手。比如,某人从银行提取存款,得到数字货币,然后买东西时支付出去,卖家拿到数字货币,中间几经流转,最后一位持有数字货币的人把钱存回银行去。银行能够验证这笔数字货币的真伪,但却又不能知道这笔数字货币曾经流经过谁的手。
1、盲签与零知识证明
同时实现匿名性、真实性,所用到的技术就是盲签,而盲签的背后又是零知识证明。
先举一个虚拟的例子(参考螃蟹仔仔的学习笔记,有修改):平遥票号日升昌,有位客户(A)存过来10两白银,要求开立一张汇票(不记名),然后他要拿着汇票去买东西,卖家(B)收到汇票后,会去日升昌取银两,但不想让日升昌知道这是A付给他的。假设票号的人非常眼尖,他看一眼汇票就能记住这字迹,从而下次看到汇票时就能想起来这是A让他签发的。因此,开票时不能让票号的人看见这张汇票。
不让日升昌看到汇票,却又要他们签出这张汇票,这怎么做到呢?A首先起草好汇票,上面写好金额(10两白银),然后放到一个信封里,信封有复写功能,因此票号看不到汇票的内容,就在信封外层签名。签名复制到汇票上,汇票就开好了。A回头从信封中取出汇票,支付给B,B再去日升昌取银两,那么日升昌此前并没有见过这张汇票,当然便不会知道这是A支付给B的。这就是盲签,我签名了,但我并不知道我签的是何内容,它便实现了匿名性。
但是,这里有一个明显的漏洞。日升昌没亲眼见过A起草的汇票,万一A填的是1000两白银,却谎称是10两呢?
所以,这里还要设计一道机制,来保证A填的确实是1 0两白银,这就需要依靠零知识证明。机制为:A起草100张汇票(假设他每次起草的字迹都是随机的。注意,这个假设很重要),每张上面全都写着“10两白银”,装入100个信封中。日升昌的人随机打开其中的99个信封,发现全部写的是10两,因此它就很放心地在剩下的那个信封上签名。因为,最后剩下的那个信封刚好是A偷偷写了1000两的概率实在太低了。如果日升昌还不放心,可以要求200个、1000个……
A向票号证明这张汇票上写的是10两白银,但又不能让票号见到这张汇票,这其实是一种零知识证明:即我不向你展示内容的情况下,却要证明内容的真实性。
当然,在现实的数字货币应用时,计算机系统里可没法使用可复写的信封,所以要引入加密机制。即,把100张汇票加密,加密后形成100个密文。票号拿到密文后,随机挑99个,让A解密给他看。解出来后,全是“XX存入10两白银”(XX是随便起的假名,以便让加密后的密文变得杂乱无章,类似前文中“随机字迹”的作用),那么票号就相信最后一个写的也是“XX存入10两白银”,但他不知道这假名是啥。当然,加密函数必须足够复杂,否则票号拿着99个明文和99个官方对照,说不定能倒推出加密函数,于是猜出来最后一个密文对应的假名是啥。
很显然,票号对应的是我们现代的银行,白银对应我们的信用货币,而汇票则是不记名存单。该方法实现了不记名存单的匿名性和真实性。
2、引入主权机关
这时,又出来一个新问题:A开出的汇票是以假名的,本质是不记名的,万一A拿这汇票去做了坏事,比如向B购买毒品,政府抓住了B,如果B守口如瓶(或者交易过程中B也不知道对方A的身份),就很难追溯到A了。这其实也是现行纸币面临的问题。于是,又对数字货币的匿名性提出了新的一种要求:对市场所有交易主体(包括银行)都是匿名的,但是在有必要时,主权机关却能做到追溯。
这是有限匿名机制。这其实是打击经济犯罪的有效手段,但又不破坏良民们合法交易的匿名性。
这时候,需要引入一个“可信第三方”,一般由主权机关安排,在我国未来实践中大概率由央行充当。简单地讲,可信第三方和银行都存储着流通中数字货币的序列号(跟纸币一样的序列号),但银行通过盲签,并不知道这笔序列号的数字货币在谁手中,哪怕客户来存取数字货币的时候都不知道。而一旦客户或银行发现违法犯罪行为,即可报警,警察叔叔便会同“可信第三方”一起沿着序列号追查坏人。
整个机制比我们前面的票号案例(没有主权机关介入)复杂一些,有兴趣的朋友可上期刊网查阅白永祥老师论文《基于盲签名的E-cash设计与实现》。文中还会用到不对称加密,本文后文有介绍。
去中心化与共识机制
上述的数字货币,本质是数字人民币。意即,它不是另外一种新的货币,它就是人民币本身,只不过原来用纸、金属制成的人民币,变成了用数字信号来制成人民币。因此,它完全没改变现行的货币体系,依然是现行的主权信用货币。
然而,西方有些顽固的人一直对政府没啥好感,老觉得政府要滥发货币害他们。因此,他们试图创造了不同于主权货币的新数字货币,即并不是数字化的主权信用货币,而是以比特币为代表的完全独立的新货币——当然,目前看它仍然不是严格意义的货币。
比特币以区块链为基础,实现了去中心化、去信任化。这也是通过一种精妙的数学方法实现的。
1、分布式网络
由于主权信用货币是由主权政府发行的,货币是欠条,主权政府是这欠条的统一中心债务人。去中心化就是不再有中心债务人,由完全平等的众多参与者共同维护整个体系。因此,引入分布式网络。将所有的参与者视为一个节点(P),那么整个体系所有节点构成一张庞大的P2P网络。所有的交易行为,全部一五一十地记录下来,并在每一个节点上存储完整备份,难以篡改。
那么,这非常类似于一个自治团队,就需要一些自治的规则,大家共同遵从。这便引出了共识机制。
共识机制来自经典的拜占庭将军问题,这是分布式系统天然面临的一个问题。拜占庭帝国幅员辽阔,将军们驻守各地(类似P2P网络中的一个个节点),需要相互通过信使传送信息,以便达成一些统一的军事行动。
比如某将军提出来大家一起攻击某敌军,派出信使通知其他将军,其他大部分将军响应,一致行动,则能取胜;如果响应的将军太少,则可能打不过敌军,最好不要行动。但将军中有叛徒,可能会故意发出错误信息(向不同将军发送进攻、不进攻的信号,让大家不一致),破坏统一军事行动(称为“不可靠节点”)。如果叛徒比例不高,大部分将军都统一行动了,那么不影响最后战果(即有一定的容错机制),但如果叛徒比例过高,就达不成统一行动,军事行动失败。
还有另外一种不可靠节点,不是叛徒,而是无能的将军……因此,不可靠节点指的是一切功能失效的节点。
还有个问题,由于中间需要信使,如果叛徒将军有能力篡改了路过他那边的其他将军的信使(称为“不可靠通信”),那么有可能使叛徒的破坏力加大。
因此,由于不可靠节点、不可靠通信的存在,所有将军都害怕收到的信息是假的,大家都不敢贸然行事,最后就无法达成统一行动,达成共识。这一问题的本质,是节点恶意行为的成本很低、然后通信不可靠,这些问题在共识机制中得到一定程度的解决。
2、不对称加密
首先,用不对称加密技术解决不可靠通信问题。
不对称加密技术,包含一对密钥对,即公钥和私钥,公钥是密钥对中公开的部分,私钥则是非公开的部分。用公钥加密数据就必须用私钥解密,而用私钥加密也必须用公钥解密。
而传统的对称加密,是指只有一个密钥。在对称加密下,收发信息的双方都要掌握同一个密钥,发信息的人加密,收信息的人解密。但在分布式系统中,所有人都是收发信息的一员,那么如果大家都掌握了同一密钥,那密钥就相当于公开了,那还有加密的意义吗?所以,对称加密对分布式系统无效。这里就需要不对称加密,用公开的收信人公钥加密,但收信人用仅自己知道的私钥解密。
不对称加密主要依赖于单向函数而实现。单向函数是指给定一个自变量,很容易算出因变量,但给定因变量,却很难倒算出自变量。也就是,这是一种很难处理成反函数的函数。
单向函数
已知x很容易算出y=f(x),但已知y时,很难算出x=g(y)。
g(·)是f(·)的反函数。
利用这样的函数,很容易构建不对称加密。以经典的RSA加密算法原理为例。这一算法基于一个很容易理解的单向函数:两个巨大的质数相乘很容易,便想把这个乘积分解为两个质数却很难。
方法如下(参考Tiny熊,有修改)
RSA加密算法
假设A和B两人要相互通信。B是发信人,A是收信人。他俩是分布式系统中的两个普通节点,所以不能用对称加密。整个过程分以下几步:
(1)A随机取大质数P1=53,P2=59,那N=53*59=3127。但从3127中很难倒算是哪两个质数相乘。
(2)然后会用到欧拉函数。取N的欧拉函数φ(N)=3016。
欧拉函数φ(N)的输出结果是1与N之间(包括1,不包括N)有多少个正整数与N互质。很显然,一个质数的欧拉函数值就是自己减1,因为所有小于它的正整数都与它自己互质。欧拉函数有一个乘法性质,即φ(ab)= φ(a) φ(b)。所以:φ(N)= φ(53) φ(59)=52*58=3016 。
(3)取一个e=3(介于1和φ(N)间的一个质数,并且和φ(N)互质)。这个e等下要用在公钥里。
(4)求e关于模φ(N)的模反元素,设为d。这个d等下要用在私钥里。
模反元素的定义:如果ed-1能被φ(N)整除,那么就称d是e的关于φ(N)的模反元素;或者换个说法,ed除以φ(N)后,余数是1;再换个说法,ed和1对模φ(N)同余,即ed和1分别除以φ(N),余数是相等的,都是1。记为:ed ≡1(mod φ(N)) 。于是,求得d=2011。
这时,A还可以销毁P1=53,P2=59。
(5)用公钥加密。A只将N=3127,e=3 作为公钥,对外公开。公钥一般写成(N,e),即(3127,3)。
假设B需要将明文m=89发给A,就用A的公钥将明文加密,加密算法为:
c = m^e mod N=89^3 mod 3127=1394,即明文m的e次方,再除以N,求得余数,这个余数就是用A的公钥加密后的密文。于是B向A传送密文c=1394。
(6)用私钥解密。A收到c后,使用自己的私钥解密。
算法为:c^d mod N = 1394^2011 mod 3127,就能得到明文m=89。
依靠这种非对称加密技术,就能够实现在分布式系统中传送加密信息,不会被篡改、截获。比特币使用的是另一种不对称加密算法,即椭圆曲线签名算法(ECC)。
而且,非对称加密还可以让P2P网络中的其他任何人验证B是发信人。B只需将一段信息用私钥加密,公告出去,大家便能用B的公钥解密它,从而验证这个信息确实是B发出的。这样,A也不用担心收到的B的信息其实是其他人冒充B发出的。
3、拜占庭容错
解决了加密传送信息之后,再接着解决达成共识的机制问题,就是建立共识协议。
首先,做决策时,得有一个将军出来首先宣布他的进攻提议,然后大家表达自己同意或不同意,并且把所有人的观点送达所有人。这里就需要等待一个时间段,以便让大家把各种信息传送到位。然后大家看到所有人的信息后,比如大部人都说“同意进攻”,那么大部分忠诚的将军就按约定的时间一起进攻,取得胜利。
如果整个网络中,大部分将军是反叛的,那么他们有可能一开始就回答说“不同意进攻”,最后无法达成进攻的共识;或者他们一开始假装同意进攻,但到了约定进攻的时候却没进攻,导致其他忠诚的将军进攻失败。
可见,当分布式系统中大部分节点是忠诚的,只有少数是叛徒的时候,不影响大家达成共识。所以,这样的网络就会有一个容错机制,中间出现小比例的不可靠节点时,不影响整个网络的正常运转。
4、共识机制
然后,还得解决由谁来充当第一位出来提议的将军。这里会需要一些协议。以比特币为例,他们采用的是工作量证明协议PoW(Proof of Work),其设计是:
区块链是由分布式网络上的每一个分布式节点全都记录下所有交易,每一段时间的交易组成一个区块,整个区块链由多个区块首尾相连。每个区块包括区块头、区块体两部分,全部交易信息记录存在区块体中。所有交易记录完毕后,把里面所有交易的信息,生成哈希值,并把它作为区块头的“Merkle根”。区块头还包括版本、父区块哈希值(上一个区块的哈希值)、时间戳、难度值、nouce等其他信息,但整个区块头信息量不是特别大。如下图(引自ustcsse308):
哈希值
哈希值是哈希函数运算的结果。
哈希函数的功能是,可以把任何输入信息转化成固定长度的一串输出值,这个输出值就是哈希值。比如比特币中用的是SHA256函数,能把任何输入信息输出为256位的哈希值。
哈希函数还有几个特点:(1)单向性,很容易算出哈希值,但从哈希值很难算出原输入值;(2)雪崩效应,输入值的一丁点变化,输出的哈希值就面目全非;(3)输出惟一性,两个输入值很难出来同一个哈希值。
哈希函数主要用于验证数据有没有被篡改。比如我们下载一个大文件,下载过程中容易出点小错。那么下载网站还会公布这文件的哈希值,我们下载完文件后,进行哈希运算,看看出来的哈希值是不是和网站公布的一致。若一致,就说明下载过程中没出错。
在区块头中,时间戳、目标值、nouce与“挖矿”有关。
先用确定目标值:最大目标值/难度值。其中,最大目标值是一个事先固定的常量,数值巨大。难度值则是一个会根据过去一段时间的挖矿情况来自动调整的量,它通过自动调整,以便让每出一个块的时间保持差不多,也就是保持整体挖矿难度基本不变。在过去一段时间内,如果挖矿能力变强,那么难度值就会自动提高,以便让目标值变小(这里目标值越小就越难达到目标,具体见后文)。
然后,矿工们(都是节点上的参与者)开始挖矿。算法是:用穷举法,不断地变换nouce值,然后把整个区块头的信用进行两次哈希运算,将得到的哈希值与目标值做对比,如果小于目标值,则矿工就完成了这次工作量(所以目标值越小就越难达到目标)。然后,第一位率先完成工作量的这位矿工就可以宣布大家记账……也就是那位首先提议的将军。别的参与者可以拿这位矿工找到的nouce值也进行哈希运算,看看其结果对不对,很容易验证。
由于每次完成工作量需要一定的时间,这也意味着,每次有人完成工作量后,就把这段时间内的交易汇总成一个区块,然后写入区块链中。
整个计算过程就是穷举法,技术含量不高,但成本不低,需要大量的计算力(计算力背后消耗的是电力等实实在在的人类资源)。但完成的矿工还可以得到比特币的奖励。因此,坏人参与进去撒谎、篡改数据意义不大,因为修改50%以上的节点数据的计算力远超挖矿,所以还不如老老实实挖矿来得实惠。这样,不可靠节点问题就得到了一定程度的遏制。因此,本质是用不菲的电力等资源,在由相互无信任的陌生人构成的分布式网络中,实现一定程度的可交易性。
因此,通过上述不对称加密、共识机制等方法,最终在一个人与人之间完全无信任的分布式记账系统中,实现了一些类似货币的功能。这便是数学的力量。