极简区块链实现

前两天在微信公众号《学习学习再学习》中看到了这么一篇文章《用 Go 打造区块链(1)基础原型》,顿时引起了我的兴趣。这也是为什么之前突然学习了一下Go语言,并发布了Go语言基础语法的原因。

其实我一直都想看区块链的代码,只是自己时间精力有限没有来得及去深挖比特币的代码。这次看到这篇文章,发现有人从头到尾一步步讲解区块链的实现,并且代码量不是很多我就抽空学习了一下。

文章的内容真的是很不错的,尤其对于像我这种区块链的初学者,又是没事喜欢码代码的码农来说更是能从浅到深深入学习。不过在学习的过程中发现,对于一个只想敲两行命令看看运行结果的人来说,文章还缺了一些具体的实验步骤。没有这些步骤,对大多数的读者来说可能就是一个障碍,导致丧失进一步了解和学习的兴趣。

本文就是对这个系列的一个补充,说直白一点就是这个系列的

实验手册

准备环境

准备环境真的是一件没有什么技术含量,但是绝对会挡住90%入门者的一道坎。可以说这个实验手册的关键内容就在环境准备上了。

安装go语言

我尝试了在两个平台上安装。

在mac上安装比较简单,直接执行一行命令就可以了。

brew install go

在linux上安装稍微有点麻烦,详细步骤请参照链接How to Install Go 1.8 on Ubuntu

如果你没有linux环境,可以安装虚拟机来代替。对linux虚拟机的安装可以参考我这篇文章--编程环境搭建

安装依赖库

除了安装go运行环境,区块链原型还需要使用数据库和加密算法。然而依赖库的安装方式在各平台上是一样的,就不用区分了。

go get github.com/boltdb/bolt/...
go get golang.org/x/crypto/...

因为原文还在持续更新中,现在的环境准备是基于part5分支的。后续是否需要其他的环境还得看原作者的文章了。

下载代码

环境准备好了,就可以下载代码了。

git clone https://github.com/Jeiwan/blockchain_go.git

构建工程

在原文中使用的运行命令是:

blockchain_go createblockchain -address

但是实际上blockchain_go是编译出来的,然而在原文中这点并没有给出步骤。当然了,有可能是作者觉得这个实在太简单了,不值得一说。那我就把这个步骤补充一下。

构建的命令是:

go build -o blockchain_go *.go

如果没有错误信息输出,且当前目录下有blockchain_go文件生成,则表示构建成功。

PS:要记住的是每次更新源代码后都要重新构建。

开始实验

所有的内容都准备好了,接下来就可以做点实验,跑跑看来观察一下所谓区块链的行为。这样哪怕看不懂代码,也可以大致了解一下都有哪些操作。

创建地址

$./blockchain_go createwallet
Your new address: 159h84bcySKEjCz9PTqVjssWaUcp1qesYG

这样你就获得了一个区块链的地址。

可以理解为这就是区块链世界的银行账号。如果要进行买卖,交易就是用的这个地址。

创建区块链

$./blockchain_go createblockchain -address 159h84bcySKEjCz9PTqVjssWaUcp1qesYG

00380b95a840e2e1164b0b4859f24993ee95bb9caed5c97f52f759511e01bf54

Done!

命令运行后打印出的一串看不懂的数字就是一个区块的标示了。

首次转账

通俗来讲,区块链就是公开的账本。那其功能之一就是转账了。那我们来转一次看看~

转账之前还得再创建一个地址,否则转给谁呢,你说是不。

$ ./blockchain_go createwallet
Your new address: 1EVnXorM3ZUrxtgavcAgu7y1U77aKo5R4J

转账

$./blockchain_go send -from 159h84bcySKEjCz9PTqVjssWaUcp1qesYG -to 1EVnXorM3ZUrxtgavcAgu7y1U77aKo5R4J -amount 3

0a213e7f892d240d2ab0a1d348e42653f92a9639a73bb636ddef9de5de2dc721

Success!

查账

$./blockchain_go getbalance -address 1EVnXorM3ZUrxtgavcAgu7y1U77aKo5R4J
Balance of '1EVnXorM3ZUrxtgavcAgu7y1U77aKo5R4J': 3

瞧,在地址“ 1EVnXorM3ZUrxtgavcAgu7y1U77aKo5R4J”下就有三块钱了~

显示区块链

$./blockchain_go printchain
============ Block 0a213e7f892d240d2ab0a1d348e42653f92a9639a73bb636ddef9de5de2dc721 ============
Prev. block: 00380b95a840e2e1164b0b4859f24993ee95bb9caed5c97f52f759511e01bf54
Created at : 2017-10-11 15:54:57 +0800 CST
PoW        : true

--- Transaction c931a82af89b35613eaf75d7615969b45dd9d977ed588a6964428543c090f7bf:
     Input 0:
       TXID:      ada9b6e85d682827b44968f396fb5878c70cd8d100af498a36fa9a7c8956651f
       Out:       0
       Signature: b4afe8ff2c7dff5a303ab17d537dc950e1d866b66e29d84ba9cc0854fc51ccf96cbaa32c7d6e4179dff068636f627da518dcccd41359d74b85f8ada45af475f9
       PubKey:    3b000f08ad53bbfd4d011939b0199bdf56043c3cca5c73181b9a08c077da863ae337445a0113e3db3311f5afefc45464223d2372d1db8b28f8d6766617ce8f15
     Output 0:
       Value:  3
       Script: 940b4a24d6bd8c474769f7e8382d572c1f20f4bb
     Output 1:
       Value:  7
       Script: 2d8552a22cec6608c383145575884e03ce6b0fe8


============ Block 00380b95a840e2e1164b0b4859f24993ee95bb9caed5c97f52f759511e01bf54 ============
Prev. block:
Created at : 2017-10-11 15:41:32 +0800 CST
PoW        : true

--- Transaction ada9b6e85d682827b44968f396fb5878c70cd8d100af498a36fa9a7c8956651f:
     Input 0:
       TXID:
       Out:       -1
       Signature:
       PubKey:    5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
     Output 0:
       Value:  10
       Script: 2d8552a22cec6608c383145575884e03ce6b0fe8

运行这个命令就可以显示出区块链上的区块了,并且还显示了有两次交易的信息。至于具体的含义可以参考原文,在这里我就不多做解释了。

调整PoW难度

PoW 即工作量证明是比特币中重要的一个概念。为了协调整个网络的算力来计算区块,会不断调整PoW的难度。之前只有一个理性的认识,现在我们手上有了代码就可以通过实验来获得感性认识。

在proofofwork.go文件中,有一个变量

const targetBits = 24

暂且可以理解为这个值就是难度的大小。值越大,难度越大;值越小,难度越小。可以通过减小这个值,再生成一个区块链或者转账来观察一下命令运行的时间。通过时间的长短来体会PoW的难度变化。

希望本文能帮助你在区块链的世界里玩得开心。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,917评论 4 87
  • 先不说别的, 上图: 项目中,我们可能会遇到以上那种情况 , 颜色,品牌,尺寸,等规格,每个规格里面有长短不一,大...
    a帆仔阅读 1,137评论 1 30
  • 女孩子骂身上的肥肉:“都怪你都怪你,害我没办法穿漂亮的衣服!害我没有恋爱谈!害我被大家笑!滚开啦!”肥肉一抖一抖很...
    洞庭府君阅读 394评论 1 5
  • 《海怪》 眼前是一望无际的大海, 我站在甲板上, 一抹粉红略过我的眼睛。 在蓝色覆盖的世界里, 粉色显的那么闪耀。...
    slow_walker凉音阅读 309评论 0 1
  • 文/蔡海山 【1】 昨天出门,在母亲的一再嘱咐下,很不情愿的在书包里放了把伞。 下楼后,发现天空滴着小雨,心想这点...
    蔡海山阅读 900评论 0 50