公信力-《图解区块链》读书笔记

智人之所以能够以劣势的生理特性横扫五大洲,成为唯一存活下来的人类,并且主导了地球进化的方向,其原因在于其通过独有的语言和文字创造了虚构的概念。人类通过对这些"虚构的概念共识"实现了大规模合作的可能,从而创造了人类辉煌。 ——《人类简史》
利用可信程序获取公信力,区块链可能成为这种虚构的力量。

引言

庚子春节注定与众不同,新冠肆虐,小拽积极响应国家号召,不恐慌,不传谣,躺在家里给社会做贡献^_^。

最近几年,区块链和比特币一直是追捧的热点,闲来无事,翻了翻15年解读区块链的一本书,算是回望历史,结果充分佐证了一句话:拿后来的认知水平去质疑过去的应对策略,是很不负责任的,肺炎亦然

本书整体打分2星,除了复盘看看,不值得一读。
笔记主要记录了区块链的一些思考、应用和golang的一个简单实现。

乌镇

一、是什么?

区块链到底是什么,不同领域认识偏差很大,常被用到的词有”自由”、”信任”、”价值转移”、”安全”等等。

百科定义:区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任“基础,创造了可靠的“合作”机制,具有广阔的运用前景。

从程序员角度看什么是区块链

小拽定义:区块链是一种开发完成后,任何人无法干预运行的可靠程序

之所以这样定义,小拽认为,区块链有两个关键技术目标:不可干预和可靠运行。进而达到程序具有公信力的最终目标。

  • 不可干预:要求具有公信力的算法和架构设计,设计者本人也无法直接修改,只能按照既定规则运转,不可篡改。例如比特币使用的算法,即使创始人中本聪也无法修改。
  • 可靠运行需要提供分布式存储,异常容灾,可扩展等架构能力,来保证稳定的运行,不会被攻击,出异常。例如比特币目前来看分布式存储,选举机制,容量也是可以从1M扩展到8M(国际扩展到20M)。

而最终达到的目标是大家认可,也就是具有了所谓的“公信力”。信任本就贵,公信价更高。而公信力的获取和维持成本极高,例如银行要维持自己的公信力,花大量资金拿牌照(找背书),在核心区建网点(提面子),还要有准备金,审计等等;而国家甚至要考军队来维持公信力。

简而言之区块链就是一个不能被篡改的,大家都觉的​灰常靠谱的数据记录方式!

二、如何用?

区块链的关键意义在于利用可信程序获取公信力,那么如何应用?仁者见仁智者见智,小拽列举一些小的思考。

  • 可信记录:比如电子病例、电子学历、电子合同、电子护照等。一旦通过区块链记录下来,就不能被以任何手段篡改,可以降低机构的公信成本。那么问题来了,写错了怎么办?答案是只能写一个新的,就像财务系统一样,钱记录错了,是不能擦掉的,只能后面新入一笔账。
  • 保险行业:保险行业接近三分之一的成本用于管理费用,那么如果区块链可以解决公信力,那么互助险是否可以利用区块链记录分摊过程来降低管理成本?
  • 股权交易:这个本身就是完全靠公信力来支撑的运营方式,
  • 电子商务:有了区块链的公信力,是否还需要“支付宝”,是否可以有更可靠的预付款和信用链?
  • 物联网:每个物联网设备的“数字化身份”、“验证”、“记录”,链式不可篡改的结构是否解决这块问题?
  • 反洗钱:所以记录至少是公开透明,不可篡改的,是否可以更利于追查?

三、Golang实现一个简单的区块链

具体看代码,入门golang写的一个小栗子,核心是信息加密和链
实际应用中有一个经典的链式结构参考:《热点账户设计》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package main

import (
"crypto/sha256"
"encoding/hex"
"encoding/json"
"io"
"log"
"net/http"
"os"
"time"

"github.com/davecgh/go-spew/spew"
"github.com/gorilla/mux"
"github.com/joho/godotenv"
)


type Block struct {
Index int // 是这个块在整个链中的位置
Timestamp string // 生成块的时间戳
BPM int // 心跳
Hash string // SHA256 生成的散列值
PrevHash string // 前一块的hash散列值
}

// 整个区块链
var Blockchain []Block


type Message struct {
BPM int
}

// 计算给定的数据的 SHA256 散列值
// 这个 calculateHash 函数接受一个块,通过块中的 Index,Timestamp,BPM,以及 PrevHash 值来计算出 SHA256 散列值
func calculateHash(block Block) string {
record := string(block.Index) + block.Timestamp + string(block.BPM) + block.PrevHash
h := sha256.New()
h.Write([]byte(record))
hashed := h.Sum(nil)
return hex.EncodeToString(hashed)
}

// 生成新的区块链,通过迁移块的hash + 时间戳 + 特定参数
func generateBlock(oldBlock Block, BPM int) (Block, error) {
var newBlock Block
t := time.Now()
newBlock.Index = oldBlock.Index + 1
newBlock.Timestamp = t.String()
newBlock.BPM = BPM
newBlock.PrevHash = oldBlock.Hash
newBlock.Hash = calculateHash(newBlock)

return newBlock, nil
}

// 校验块,主要检查区块的传递是否正确,
// 通过Prehash 与前一块的hash是否一致,通过cal算出当前hash是否一致
// 校验的原则:始终选择最长的链
func isBlockValid(preBlock, afterBlock Block) bool {
if preBlock.Index+1 != afterBlock.Index {
return false
}

if preBlock.Hash != afterBlock.PrevHash {
return false
}

if calculateHash(preBlock) != afterBlock.Hash {
return false
}

return true
}

// 最长的链标识数据是最新的,所以需要一个函数来将本地过期的链切换成最新的
// 检查长度,直接替换
func replaceChain(newBlocks []Block) {
if len(newBlocks) > len(Blockchain) {
Blockchain = newBlocks
}
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 上面是xiaozhuaichain 的主要函数,下面采用web方式来展现

// 初始化web服务
func run() error {
handler := makeMuxRouter()
httpAddr := os.Getenv("ADDR")
log.Println("Listening on ", os.Getenv("ADDR"))
s := &http.Server{
Addr: ":" + httpAddr,
Handler: handler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}

if err := s.ListenAndServe(); err != nil {
return err
}

return nil
}

// get 请求来查看链,post请求来写链
func makeMuxRouter() http.Handler {
muxRouter := mux.NewRouter()
muxRouter.HandleFunc("/", handleGetXiaozhuaiChain).Methods("GET")
muxRouter.HandleFunc("/", handleWriteBlock).Methods("POST")
return muxRouter
}

// 读取
func handleGetXiaozhuaiChain(w http.ResponseWriter, r *http.Request) {
bytes, err := json.MarshalIndent(Blockchain, "", " ")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
io.WriteString(w, string(bytes))
}


// 写入
func handleWriteBlock(w http.ResponseWriter, r *http.Request) {
var m Message

decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&m); err != nil {
respondWithJSON(w, r, http.StatusBadRequest, r.Body)
return
}
defer r.Body.Close()

newBlock, err := generateBlock(Blockchain[len(Blockchain)-1], m.BPM)
if err != nil {
respondWithJSON(w, r, http.StatusInternalServerError, m)
return
}
if isBlockValid(newBlock, Blockchain[len(Blockchain)-1]) {
newBlockchain := append(Blockchain, newBlock)
replaceChain(newBlockchain)
spew.Dump(Blockchain)
}

respondWithJSON(w, r, http.StatusCreated, newBlock)

}

// response
func respondWithJSON(w http.ResponseWriter, r *http.Request, code int, payload interface{}) {
response, err := json.MarshalIndent(payload, "", " ")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("HTTP 500: Internal Server Error"))
return
}
w.WriteHeader(code)
w.Write(response)
}

func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}

go func() {
t := time.Now()
// 小拽,第一个创世块
genesisBlock := Block{0, t.String(), 0, "", ""}
spew.Dump(genesisBlock)
Blockchain = append(Blockchain, genesisBlock)
}()
log.Fatal(run())

}

四、一点摘录

P12:区块链的五大特性:去中心化(Decentralized)、集体维护(Colletively maitain)、高度透明(Transparent)、去信任(Trustless)

P18:央行发型数字货币的原则(周小川)

  • 提供便利和安全性
  • 保护隐私与维护社会秩序、打击违法犯罪的平衡(显然比特币打破了平衡
  • 有利于货币政策的有效运行和传导
  • 保留货币主权的控制力
    (显然,比特币或者目前已知的电子货币还都不具备)

P89:区块链的关键意义:无需中介和公信力。两大意义主要通过共享账本和共识机制两种技术实现。

P10:区块链的每个区块的三要素:本区块的ID,加密一段时间内全部的信息体,上一区块ID。

P16:现钞的发行和汇拢基于“中央银行-商业银行机构”的二元体系来完成。数字货币的发行和运行同样要基于该体系,但是“运送”和“保管”会发生变化,运送方式有物理运送变为电子运送,保存方式变为云计算空间——周小川

P19:R3的核心职能是指定银行业区块链技术开发的行业标准。目的是要做一个全球的去中心化的实时银行间清结算系统。

P43:中国对比特币是绝对禁止,但是对区块链“是一项可选的技术”
(15年对于区块链已经是认可的,但比特别明令禁止,和目前差异不大)

P111:2016年2月,央行明确表示发行数字货币的战略目标,争取早日退出央行的数字货币。


20200126 于西山林语

崔小拽 wechat
欢迎您扫一扫上面的微信公众号,订阅小拽的博客!