Yann He

programmer for JavaScript, Python, Java

Read this first

榕榕客栈

WechatIMG519.jpeg

欢迎来到榕榕客栈!

客栈主人榕榕姐。
WechatIMG525.jpeg

我们是一家位于加拿大蒙特利尔的民宿客栈。
WechatIMG523.jpeg
希望通过榕榕客栈让大家爱上蒙特利尔。
WechatIMG101.jpeg

客房收费标准如下:

大套房:120加/天
1号房间(大床房):70加/天
2号房间(三人间):70加/天
3号房间(双人间):60加/天
一楼三人间:80加/天
半地下室大房:90加/天

客栈需知如下:

1.住宿不包括吃饭,可以自己做饭,提供厨房锅碗瓢盆
2.AA制,购买食材等要分清产权
3.洗衣机使用时间早8:00~20:00,不允许用洗衣机洗内裤和袜子
4.不要在大厅等公用空间打电话、大声喧哗

周边资源

1.华人超市(世纪超市):步行距离10分钟,可以买日常食材。可以去打工12.5加/小时
2.Super C(本地人超市):步行距离10分钟,可以买公交卡。
3.汇丰银行:步行距离25分钟,可以开加拿大账户。
4.Costco:步行距离30分钟
5.电影院:步行距离45分钟,每周二可以看打折电影(约8加元)
6.小公园:榕榕客栈就坐落在公园边,满眼绿色,景色迷人。

蒙特利尔的当地居民很朴实,点点滴滴都让人感动。
愿大家好好享受蒙特利尔,
WechatIMG526.jpeg

WechatIMG518.jpeg

WechatIMG517.jpeg

Continue reading →


重新创造比特币序:像个唱着freestyle的说唱歌手

说唱4.jpeg

这本书写得不怎么“严肃”,有点像那旋律随意的即兴说唱。

前面几章还小心翼翼的合着节奏,从第7篇:UTXO开始就跳脱节奏的束缚,越来越不“正经”。到了第12章:群系统(下)竟然玩起了Lay back甚至无伴奏说唱。

第3章:舍弃账户模型和第4章:数字签名,逻辑有点绕,但不难理解。坚持着穿越过去,后面就容易啦!

第9章:万物皆交易和第12章:群系统(下)写得比较抽象,这里看不懂也没啥事,不要气馁,后面的章节就舒服啦!

本书主要面向非技术专业的读者。

采用讲故事的方式来串联Bitcoin的核心技术概念。

前10篇为上半部,主要讨论系统的核心业务:交易。

后10篇为下半部,主要讨论如何更好的支撑业务:群系统。

交易包涵的技术:非对称加密、公钥私钥、交易签名、UTXO、交易脚本等。

群系统包涵的技术:P2P网络、交易内存池、Block Chain、POW、分叉等。

本书的核心价值在于,定位,即给技术概念以全局视角的定位。

很多技术概念做了简化处理,目的是降低理解难度。

专业技术资料推荐阅读aaron67的blog:https://aaron67.cc

感谢好友:简美、张韦、船长,在我写作期间的阅读陪伴和反馈,你们给了我很大的信心和动力。

感谢BSV社群(BSV骷髅会群和BSV学习群),让我接触到了Bitcoin的真知灼见。

BSV骷髅会:https://svskull.club
BSV学习群:http://1bsv.cn
比特币SV(Bitcoin satoshi vision,BSV)是目前唯一一个遵循中本聪原始白皮书,遵循中本聪原始协议和设计的比特币。BSV是唯一的公共区块链,维持比特币的原始愿景,并将大规模扩容成为企业级区块链和世界新货币。

本书出品方:BSVer的混沌世界(微信公众号)

重新创造比特币.pdf电子书已上链BSV:https://bico.media/7c27c65261f58a45572dfc422bebd5acd8edf10d02331779904f7737091cc0b0

2019/7/31 何岩

相关文章:

...

Continue reading →


重新创造比特币1:从一个简单的web交易系统开始

本系列一共20篇:

重新创造比特币1:从一个简单的web交易系统开始

重新创造比特币2:第一个版本上线啦

重新创造比特币3:舍弃账户模型,让交易更自由

重新创造比特币4:数字签名

重新创造比特币5:公钥和私钥

重新创造比特币6:第二个版本上线啦

重新创造比特币7:UTXO

重新创造比特币8:基于UTXO的系统重构

重新创造比特币9:万物皆交易

重新创造比特币10:交易脚本

重新创造比特币11:群系统(上)

重新创造比特币12:群系统(下)

重新创造比特币13:P2P网络

重新创造比特币14:交易的同步

重新创造比特币15:账本的同步

重新创造比特币16:Block Chain(付费)

重新创造比特币17:网络的弹性(付费)

重新创造比特币18:工作量证明(上)(付费)

重新创造比特币19:工作量证明(下)(付费)

重新创造比特币20:分叉之重组与分裂(付费)

0.前言

What?写的是什么?

定位。即,从全局视角,给各技术概念以定位。

Why?为什么要写?

因为,自己学习比特币技术的时候觉得费劲,所以想要解决这个问题。

为什么会学着费劲呢?

因为,学习资料不讲概念的定位(from where to where),直接上来就讲概念的描述(what)。

我迷失在了细节的海洋,见树不见森。

如果没有讲定位的书,那我就自己来写吧,因为创造是最好的学。

How?如何来写?

重新创造。即,通过编故事,构建出Bitcoin从简单到复杂的演进全貌。这就是费曼所提倡的"Learn by doing"。

1-1.png

用简单的技术,构建简单的系统。系统慢慢演进,变得复杂又丰盛,就像一棵小树张成了参天大树。

读者伴随着树的生长,自然会理解每一个树叶的来龙去脉。

(备注:由于故事纯属虚构,为了突出定位,会将技术概念简化。具体技术细节的学习,建议阅读专业资料:aaron67的blog:https://aaron67.cc 等)

人脑喜欢故事。

我要讲故事。

1.缘起

1999年,中途镇,咖啡馆,上午10点,中本聪准时出现在靠窗子...

Continue reading →


重新创造比特币2:第一个版本上线啦

1.Bitcoin0.0.1版上线啦

一周之后,中本聪完成了Bitcoin第一版的编码工作,按照之前的计划,中本聪跑到最近的电脑城买了一个低配的服务器,把服务器抱回咖啡馆,连上网线,装上linux操作系统。最后将写好的系统部署了上去,启动!

又在godaddy.com(卖域名的网址)上买了域名:www.bitcoin.org,关联到Bitcoin的主机IP,通过域名可以访问Bitcoin系统啦。

Bitcoin就这么羞涩的向世界宣布:“我来啦!”

中本聪说:“老板,Bitcoin可以用啦!”

老板Bob冲着店里的顾客喊道:“哈哈,太棒了!有谁想成为历史上第一个使用Bitcoin的人?”

Alice说:“我来!Bitcoin还是受了我的启发呢!我要用它买杯拿铁。小子,这玩意怎么用?”

中本聪说:“你先用手机的浏览器打开这个网址:www.bitcoin.org"

Alice用手机打开Bitcoin的网站看到的是这个样子的界面:(见下图:登陆界面)

2-1.png

Alice说:“哇,真的运行起来啦!小子,我的用户名和密码是什么?”

中本聪说:“忘了给你注册,稍等!”

中本聪进入到Bitcoin的主机后台,用vi工具(linux上的编辑文件的工具)在user.txt里面加上了一行数据。

Alice, Bitcoin123, 0

“好了,你的用户名是Alice,密码是Bitcoin123,密码千万别告诉别人”

Alice在登陆页面输入了用户名和密码,界面变成了这个样子:(见下图:个人余额界面)

2-2.png

Alice:“我的余额是0,需要用美元兑换Bitcoin吗?”

中本聪:“是的,你给我美元现金,我给你转账Bitcoin”

Alice给了中本聪100美元,中本聪用自己的账号登陆后给Alice转账了100个Bitcoin。

中本聪解释道:“如果你想换回美元,你再找我用Bitcoin兑换成美元”

中本聪就成为了人肉的Bitcoin交易所。

货币总量等同于中本聪自己的账号的默认余额:2100万个Bitcoin。

当然这只是一个临时方案,这样的系统设计和美联...

Continue reading →


重新创造比特币3:舍弃账户模型

0.前言

Bitcoin的第一个版本已经上线,它的意义在于,展现了系统的使用场景。

1.舍弃账户模型

自从Bitcoin第一个版本(v0.0.1)上线,咖啡店的生意越来越好,老板Bob显然做了一个明智的决策。

中本聪却越来越烦恼:“这么多人来找我注册账号和兑换Bitcoin,都没时间编程了,我得想想办法。把兑换工作交给老板Bob吧。”

中本聪说:“我说,老板,现在越来越多的人来找我兑换Bitcoin,我都成了人肉交易所啦,没时间升级系统了,要不兑换的工作你来做吧。”

Bob说:“好啊,正合我意,不过我可以调整汇率吗?”

中本聪说:“当然可以,这符合自由市场经济学理论。”

Bob高兴的答应了,中本聪将自己的账号密码告诉了Bob,咖啡馆就正式成为了Bitcoin的线下交易所。

中本聪感到轻松了很多:“那么,就还剩下用户注册的功能。”

中本聪一边思考着,一遍拿出笔记本准备开始编码。

忽然,有个大胆的想法在中本聪的脑子里闪过:“能不能彻底的去掉用户注册呢?”

之所以要有用户注册功能,是因为每个用户都要在user.txt中创建一条账号记录。

每个用户的账号信息只包括三个字段:用户名、密码、余额。

如果能用其他的方式来替代这三个字段,那么就可以舍弃“账户模型”了。

首先是用户名,可以用账本替代。因为每笔交易记录都包含着付款方和收款方的用户名,所以账本(transaction.txt)可以代替账户(user.txt)定位出用户名。

其次是余额,账本也可以替代。因为账本就是交易流水,累计交易流水可以得出用户的余额。所以账本(transaction.txt)可以替代账户(user.txt)实现余额。(具体获取余额的逻辑见下图)

获取余额的两种方式对比

解决了用户名和余额之后,最难的部分是如何去掉密码。

密码的作用是向服务端证明Alice是真正的Alice,而不是一个叫Calor的家伙的冒充,除非Calor知道了Alice的账号密码。

所以密码的本质是一把钥匙。

那么除了密码,有没有其他方式呢?

“用对称加密的方式可以吗?”中本聪思考着。

2.对称加密

对称加密...

Continue reading →


重新创造比特币4:数字签名

0.前言

前篇说到了对称加密,并且我们发现没必要将交易的消息全部加密,因为交易数据不怕见光。只需要加密一小部分即可,究竟应该加密什么呢?

1.签名

既然我们的根本目的并不是防止别人看到交易数据的明文,而只是要用密文证明“我是我”。那么我的要求就是尽量加密更少的文字,即,加密付款者的名字。

这是为什么呢?

启发往往来自于现实生活的例子,赵四想买台拖拉机,但是钱不够,向刘能借了1万块钱,刘能要求赵四写个借条。赵四当然不愿意写啊,赵四就说自己不会写字。刘能当然不能放过他啊,刘能就帮赵四写了欠条:“赵四欠刘能壹万元整”,但是这个欠条并不具有法律效果,因为赵四可以说是刘能自己瞎写的。那么为了让这个借条成为证据,赵四最少也要签上自己的名字。因为赵四的笔迹是全世界唯一的,所以赵四签上了自己的名字,就代表着这个名字的本人认可这张借条的内容。如果赵四签的不是自己的名字,这张借条也不成立,也就是说赵四的唯一的笔迹,只在写自己的名字的时候生效。(见下图:签名)

签名

赵四的写字方式就是私钥,因为全世界就赵四能用这种方式写字,“赵四”这俩个标准汉字就是公钥,赵四的私钥(写字方式)只有在加密自己的公钥(“赵四”)的时候有法律效应,加密别人的公钥(签别人的名字)就无效,反之,法官看到赵四的签名(那个写得乱七八糟的签字,等价于加密后的密文),可以用公钥来解密签名,因为公钥是“赵四”,所以法官可以调取法院保存的签名数据库,找到赵四过往的签名来对比。也可以传唤赵四本人出庭,让他辨认(解密)一下这个签名(密文)是不是自己签署(加密)的。

现实中我们管借条上的名字叫做签名,签名就是证明“我是我”的最少文字。

根据上面得到的灵感,借鉴到Bitcoin交易系统中,Alice用私钥加密名字即可作为证明,加密后的密文就称为:数字签名。(见下图:利用数字签名来证明Alice是Alice)

利用数字签名来证明Alice是Alice

2.签名用户名的漏洞

中本聪一遍一遍的在脑子里模拟着系统的运行,忽然发现了一个漏洞。

这个漏洞就是由于服务器没有存储用户名和公钥的对映关系,所以就不知道Alice的公钥是什么。如果有人用自己的公钥签署了别人...

Continue reading →


重新创造比特币5:公钥和私钥

1.公钥和私钥

那么用户的公钥和私钥又是如何生成的呢?

这里正是采用非对称加密真正精髓之处,用户的公钥是由私钥计算得来,而用户的私钥则反直觉的由用户自己生成。

用户如何自己生成一个私钥呢?

(备注:公钥私钥更加详细的技术讲解可以阅读aaron67的文章:[学习笔记] 比特币的私钥和公钥)

私钥的本质是一个数字,公钥的本质也是一个数字,如果把任何数字当成私钥,都可以利用椭圆曲线加密算法生成这个数字对应的公钥,即,Function椭圆曲线加密算法(私钥)=公钥

如果让用户随机生成数字,并且数字的随机范围足够大,就可以避免两个用户生成了相同的私钥,即,私钥冲突。

多大的数字够用呢?

答案是2的256次方。

创建私钥本质上是“取得一个1到2的256次方之间的数字”。

你可以通过投256次骰子,并且用铅笔和纸张将结果记录下来。

结果看起来是这样:

1111100101111100100010011010101010101100111100001101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

一共256个二进制的字符。为了让它看起来短点,我们将其转换成十六进制,这样就减少到了64个字符,每位代表4个bit。

(备注:一个二进制的数字就代表着1bit。再进一步解释bit的定义是:可以让50%概率的事情变为100%的确定性的信息,这个信息所等价的能量就是1bit。例如:在二进制中,下一个我要写的数字只能在0或1中选择,这时候下一个数字的概率就是50%,如果我写出来了1,那么这个1就是将50%的不确定性,变成了100%的确定性,这个1代表的就是1bit的能量,同理如果我选择的是0,这个0同样代表着...

Continue reading →


重新创造比特币6:第二个版本上线啦

0.前言

中本聪和Gilfoyle一起合作,完成了Bitcoin0.0.2版本的设计工作。

重要的改变包括:

1.加入数字签名。

2.公钥替代用户名。

3.将签名加入交易模型。

4.删除了账号模型。

新版本,让交易变得更自由!

1.创建私钥

中途镇,咖啡馆,经过一周的开发和测试,Bitcoin0.0.2版本上线了。

中本聪找到Bob:“Hi,老板,Bitcoin的新版本上线啦!再有新客户想加入,不用再来找我注册啦,他们自己就可以创建账号(其实是地址,Bitcoin已经没有账户模型了)啦”。

Bob朝着大厅喊道:“太好了!有人要来杯咖啡吗?顺便试试新系统!”

Alice走过来:“我来吧,正好想再喝一杯卡布奇诺。”

Alice拿出手机,打开浏览器,输入bitcoin.org。出现了这样的界面。

Alice叫到:“怎么和以前不一样了!”(见下图:新版本的登陆页面)

新版本的登陆页面

中本聪说:“你需要先创建私钥”

Alice问:“什么是私钥?“

中本聪说:“你可以把私钥当成是你的账号密码,这个密码很长,可以代替之前的用户名+密码”。

Alice说:“这么说我就理解了”

中本聪说:“你先创建私钥吧”

Alice选择创建私钥,点击了确定按钮,进入了下一个界面(见下图:生成的私钥和公钥)

生成的私钥和公钥

Alice按照提示,拿出笔抄写着自己的私钥:“这个公钥又是什么?”

中本聪说:“你可以理解成你的收款地址,你也可以用他来查询余额,公钥是公开的,只有私钥需要保密”

Bob在一旁看着,问到:“这个私钥看起来很重要,它是在哪里生成的?在服务端还是客户端(浏览器就是客户端),安全吗?可以和我说说你是如何做的吗?我以前学过点编程,应该能听懂。”;

中本聪说:“原来老板也懂编程啊,私钥是在客户端生成的,私钥永远不会在网络中传输,因为一旦被截获,别人将你的私钥导入,你的余额会被分分钟转走。”

中本聪继续解释到:“但是生成私钥的算法代码是在服务端存储的,当浏览器第一次访问bitcoin.org的时候,服务端会将算法代码返回给浏览器,这时浏览器就拥有了生成私钥的计算能力,...

Continue reading →


重新创造比特币7:UTXO

0.前言

Bitcoin的第二个版本已经上线,运行正常。

重要的改变包括:

1.加入数字签名。

2.公钥替代用户名。

3.将签名加入交易模型。

4.删除了账号模型。

这篇在讲如何重新定义交易。

交易是经济学理论的核心,交易是一切。

交易即承载着每个个体的起心动念,交易也承载着整个世界的斑驳陆离。

对交易这个概念的认知高度,决定了Bitcoin系统的高度。

如何认知交易,就表现在如何定义交易。

1.Bug出现!

新版本上线后, 系统看起来一切正常。

不过,只要是人写的程序就会有Bug。

这一天Alice找到中本聪,说自己的余额忽然归零了,怀疑自己的私钥泄漏了。

中本聪赶紧登陆到服务器上,查看账本中的交易记录,发现了Alice的交易记录有异常。

怎么会有重复的交易记录呢?(见下图:账本)

账本

中本聪问:“Alice,你最近做了几次转账?”

Alice说:“就一次,昨天给Carol转账20个Bitcoin”

中本聪说:“可是,在账本里我查到了3笔给Carol的转账(公钥C代表Carol的公钥)”

中本聪找来Gilfoyle,两人一起分析,很快找到了问题所在。

原来是Carol搞的鬼,Carol截获了Alice的交易请求,并重复的将其发送给服务端,服务端错误的认为是Alice在多次请求转账,结果就是将Alice的余额全部转给了Carol。(见下图:Carol在搞鬼)

Carol在搞鬼

2.分析Bug

问题的根源是什么呢?

原来问题出在签名上,在现在的设计中,同一用户在不同交易中,签名没有变化。

服务端只会验证签名真伪,只要签名是真的,交易就成立。

黑客会重复发送伪造的交易请求,直到用户的余额小于交易金额。

那么签名为什么没有变化呢?

这是因为签名是将公钥加密,公钥不变,所以签名就不变。

签名不变,就意味着,签名的权利空间为用户的所有余额。

分析到了这里,中本聪对Gilfoyle说:”我们得让每笔交易中的签名都不同,最好是每笔交易的签名是系统唯一的”

如何做到让签名在每笔交易都是变化,且唯一的呢?

Gilfoyle说:“加密整...

Continue reading →


重新创造比特币8:基于UTXO的系统重构

1.重构交易模型

中本聪在脑中,模拟运行着UTXO的设计:“现在的设计应该没有大的缺陷了,可以进入交易模型的设计啦”。

Gilfoyle:“UTXO的确优雅,交易模型的改动会很大”

所谓交易模型的设计,就是说,通过重新构建交易模型,来承载UTXO机制。

新的交易模型,分为四个部分:

1.TXID:交易的Hash值(关于Hash是什么,后续会详细介绍,现在可以简单理解为:任何数据作为参数,输入到hash函数中,都会生成一个固定长度,并且唯一字符串,即, Hash值=FuncHash(m)。)

2.IN部分:本交易引用的所有UTXO

3.OUT部分:本交易生成的所有UTXO

4.ScriptSIG部分:本交易的签名脚本:数字签名(密文)+付款者公钥(明文)

解释一下:

TXID:计算交易数据的Hash值:TXID=FuncHash(TX)

IN中引用的每一条UTXO的字段:TXID、VOUT(VOUT是本UTXO其所在的TX的OUT中的排序号)

OUT中每条新生成的UTXO的字段:排序号,收款者公钥,金额

数字签名密文:加密交易的TXID生成的密文:数字签名=FunSig(付款者私钥, TXID)

ScriptSIG部分:数字签名密文+付款者公钥(明文),这两个部分用逗号拼接。

例如这样的场景:Alice要转账3.5个Bitcoin给Bob。

Alice的浏览器需要创建交易,包括4个部分:

1.IN:引用了2条属于自己的UXTO。

2.OUT:创建2条新的UXTO,一条UTXO属于Bob,另一条UTXO属于自己的找零。

3.TXID:生成当前交易的Hash值:TXID=FuncHash(TX)

4.ScriptSIG:Alice的数字签名+Alice的公钥(见下图)

8-1.png

重构后的交易模型

用JSON结构来表示交易模型:

{
    "txid": "135cf9b9cca2640113937dbf5b2fc62222ccf16c63556ccc3f2a5da899020efa",
    "vin": [
...

Continue reading →