【学界】比特币与给韩梅梅的情书

【学界】比特币与给韩梅梅的情书

作者简介:张天威,香侬科技 (shannon.ai) 算法科学家,博士毕业于美国普林斯顿大学 (Princeton University),博士研究领域为分布式系统、系统安全。
欢迎原链接转发,转载请前往 @香侬慧语科技 的主页获取信息,盗版必究。
敬请关注和扩散本专栏及同名公众号,会邀请全球知名学者陆续发布运筹学、人工智能中优化理论等相关干货、知乎Live及行业动态:
『运筹OR帷幄』大数据人工智能时代的运筹学--知乎专栏

本文首发于@香侬慧语科技比特币与给韩梅梅的情书


本文主要总结和讨论数字货币的基本原理。 我们主要以比特币作为例子, 一步步的分析比特币的各个特征和设计。 然后我们会简单讨论其他的一些基于比特币的货币, 以及他们之间的区别。

密码学基础

谈数字货币绕不开密码学。两个最常用的密码学概念是哈希函数和公私钥机制。

  • 哈希函数: 传统的哈希函数就是一个变量空间 x 到另外一个变量空间 y 的映射: y=H(x) 。在密码学中, 哈希函数还有特别的性质: (1) 给定 x 很容易计算 y , 但是给定 y 不能很容易的得到 x 。唯一的方法就是遍历 x 空间;(2) 很难找到两个 x_1 , x_2 ,他们的哈希值一样, 尽管这样的 x_1x_2 是存在的。
    从数学上讲,大家可以认为哈希函数是一个复杂的函数。打个比方, y=2x^2 是一个函数,但是不是一个好的哈希函数。因为给定一个 y , 我们可以非常容易地反向猜到 x . 哈希函数的目的是,给定一个 y ,我没法容易地找到 H 的逆函数,通过这个逆函数找到 x 。我只能通过暴力穷举 x ,然后看 H(x) 是不是等于 y ,从而找到答案。
  • 公私钥机制: 给定一个加密算法,每个个体都可以任意的产生一组公钥 PK 和私钥 SK (通常是256bit或者512bit的字符串)。大家可以认为公钥和私钥一个是钥匙,一个是锁,两者一一对应。 其中公钥 PK 是发布给外界,而私钥 SK 是自己保存不能外泄。
    公钥和私钥是干嘛的呢? 举个例子,李雷和韩梅梅,李雷想给韩梅梅写封情书,但是他不想让外人知道情书的内容。我们假设李雷情书的内容是“我爱你”, 李雷第一步用韩梅梅的公钥 PK_韩 对其进行加密。公钥是所有人都知道的,所以李雷也同样知道韩梅梅的公钥 PK_韩 。我们假设韩梅梅的公钥SK就是她的名字,“韩梅梅”。 加密过程涉及到加密函数 Enc . 这个函数用实际情书内容"我爱你"和韩梅梅的公钥 "韩梅梅" 作为输入,得到一个输出, 叫做 data_{enc}
    data_{enc}=Enc(``我爱你", PK_韩)
    我们假设 Enc 函数是将两个字符串合并后,将奇数字和偶数字对调,我们得到如下:
    合并: “我爱你韩梅梅”
    奇偶对调: "爱我韩你梅梅"
    李雷将加密后的字符串,也就是 ‘’爱我韩你梅梅"发给韩梅梅。韩梅梅收到信息后,她需要用自己的私钥 SK_韩 以及解密函数 Dec ,对这条信息进行解密。
    data = Dec (``爱我韩你梅梅'',SK_韩)
    为了方便,我们假设韩梅梅的私钥 SK_韩 也是 ”韩梅梅“, 解密函数的功能是,将吃进的字符串的奇偶数对调,然后从字符串后面删除 SK_韩
    奇偶对调:”我爱你韩梅梅“
    字符串删除(”韩梅梅“): "我爱你"
    这样一来,韩梅梅就知道,李雷发过来的原字符串是 "我爱你"。
    当然实际工程中,加密和解密函数都是非常的复杂函数。

一个简单的数字货币

有了上面两个概念,我们就可以来理解数字货币了。数字货币需要考虑两方面:货币的创造,和货币的交易。我们从简单的货币开始,然后逐步过度到复杂的比特币。下面的例子取自于Bitcoin and CryptoCurrency Technologies一书。

我们先看一个简单假想的数字货币。假设在这种货币中,银行Goofy可以随意定义一个字符串 uniqueCoinID 作为币。这个币用数字来表示就是

Coin0=Enc( ``CreateCoin " + uniqueCoinID, sk_{goofy}))

实质上就是Goofy用自己的私钥对 ``CreateCoin”+uniqueCoinID 进行加密,这样就是一个货币了。如果Goofy把这个货币卖给Alice, 那么Goofy可以创造一个新的数据:

Coin1=Enc(``Pay to " + pk_{alice} + H(Coin0), sk_{goofy})

在这里Alice的身份就用Alice的公钥表示。 Alice可以任意创建公钥来表示自己的身份。这个就是数字货币的匿名性。这个数据公布之后,就表示Alice收到了Goofy给她的货币。同样的, Alice把货币卖给Bob, 那么Alice可以创造一个新的数据:

Coin2=Enc(``Pay to " + pk_{bob} + H(Coin1) , sk_{alice})

这个数据公布之后,就表示Bob收到了Alice给他的货币。其实所谓某个人给了某个人的货币,只不过就是在账本上记录了这些交易记录,然后修改每个人的余额,上面的  Coin0 , Coin1 , Coin2 仅仅就是一个交易记录。

把很多的交易记录放到一起,我们就形成了一个区块。大家可以认为一个区块就是一个账本,账本里面记录了很多不同人之间交易,通过追溯,我们就知道谁给了谁钱,然后就知道每个人的账户里面有多少钱。


但是这个会造成一个问题,叫做双重支付:Alice可以把这个币 Coin2 付给Bob之后, 在Charlie还没有收到这项交易的通知(网络传递有延迟),Alice把 Coin2 付给Charlie。 这样Alice就可以用同样的币双重消费而无法避免。

为了解决双重支付的问题,我们修改一下币的协议的内容。下图显示了货币产生和货币交易的过程。其中显示了要消耗的币的代号以及需要交易的价值和接收者。transID73 代表了一个账本(区块),代号73。在货币产生过程中 (左图),一共产生了三次货币,金额分别是 3.2, 1.4, 7.1。 产生的货币分别给了三个人,用 recipient 标出。 右图显示了交易,产生的货币,通过交易给了不同的人。交易的区块最后有一个发送方的签名,就是用发送方的私钥 SK 加密这个区块,用来确认这个确实是发送方发出来的。

图1: 货币的产生和交易区块(账本)

在这种情况下,银行Goofy就可以建立起一个区块链,如下图所示。每个区块链都表示产生货币或者交易货币。每个区块链都包含着上一个区块链的哈希值。当新的区块产生的时候,银行Goofy会来验证区块里面的每一项交易是不是有双重支付的嫌疑。如果每个交易都是合法的,那么Goofy就会把新的区块加到链上,从而形成区块链。大家可以认为区块是一个小账本,把小账本合起来变成了一个大账本,也就是区块链。

图2: 把区块穿起来,就形成区块链

这个可以解决双重支付的问题, 但是需要银行来执行, 并没有去中心化。


传说中的比特币

比特币就是在上面的基础上加以改进形成的去中心化数字货币。在比特币中,没有银行,所有的用户都是同等的身份。我们先讲如何交易,然后再讲如何造币。

.......

未完

欢迎关注公众号浏览余下内容:

【学界】比特币与给韩梅梅的情书mp.weixin.qq.com图标

如果你是运筹学/人工智能硕博或在读,请在下图的公众号后台留言:“加微信群”。系统会自动辨认你的关键字,并提示您进一步的加群要求和步骤,邀请您进全球运筹或AI学者群(群内学界、业界大佬云集)。

同时我们有:【运筹学|优化爱好者】【供应链|物流】【人工智能】【数据科学|分析】千人QQ群,想入群的小伙伴可以关注下方公众号点击“加入社区”按钮,获得入群传送门。

学术界|工业界招聘、征稿等信息免费发布,请见下图:

编辑于 2018-05-19

文章被以下专栏收录