Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
164 0 0
发币是什么意思?" J1 c6 T# o/ m- N4 ]9 N/ Q

/ D; w, u( Q2 e# Y( R问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储
, y0 y( \) e2 X9 @5 o. z3 H. n% K  G. z; F1 ^, n
改进方法:引入特殊的存储机制
; d) v" m9 M6 n; I$ V2 ]- G+ @# {$ b7 L, N0 R, g. x9 C
报错了,搞不明白,明明一模一样的,错误截图如下:# S, o0 _+ W1 Z5 z+ p
# N, z! p& g) p: [# i
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!
3 y& D0 A9 x/ ?  i7 n9 i$ S
2 X' V! G) M, l5 d: o4 T1 _一个block区块里面可以有多笔交易是什么意思?8 g; H0 \1 H* d4 P4 i, Y4 W
1 k0 C. _: o4 f0 U. P. r
合约和区块链什么关系?0 @; |0 \& q4 @- E; F# `

( C9 C6 s& }/ K6 M0 s: R6 ]完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd788 I) k  }$ F2 U

+ d5 Z) V1 P& g3 ?+ @) }# E/ j但是数据库内容还不知道对不对。: h5 a1 K! I' C5 s' P( y* n% a8 h

* V* }# L/ r5 y$ o8 K6 N- ?5 S, d1 r问题二:main函数太不优雅了,不灵活
' f* M  J% V+ A) D# L8 r
5 ?" X/ b0 M8 B: y! b% v& y把交易记录写入区块放到命令行做。
( W/ q' k( L8 z8 Z5 v
4 F2 ]# b1 ^1 H. P! P交易记录和区块是什么关系?
7 C. S% g" [% ?0 n+ ^( }2 _7 x3 H4 O1 O
难道没次发生交易就要创建区块,那不是太麻烦了?
$ S3 Q  q/ x4 Z- ]2 f' e5 f& h0 g# I" z6 U5 U
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b6 U9 E: X. O2 S6 Q
% J0 F( }- _! R  r% d
CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
0 \. l4 V0 A5 k) W* E' O( g
( L6 o' Y3 P& U+ W, ^2 B定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
9 z0 d# y3 _; B# w; h& V
( i& h* k& `7 B4 `' W6 x5 |. mfunc (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
/ i0 J* ^# ^3 t4 V; o- s; x
# x0 }4 n! h; u7 Q7 l. v验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
1 b1 K0 b3 D' w+ i1 @! o) [( q$ {. b5 R- v# \5 c6 H' C7 r
添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62
& I6 \- v3 m1 v/ W$ J5 n* W  z5 _& k6 }4 X
这些方法又都是供Run()选择调用的5 W/ ]" s/ Q7 P  w
+ T. h  Y% Z& Q) _- Q7 ?* v, b) E9 j
添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d
- F, k! ~# `! V0 z# \! ~! I
* B  N$ t' v( i' f" v测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99# K# M( l1 ?! [
9 |% V/ h% @/ C: [1 k1 R1 t
./coin& |$ L7 c# O- ^% u1 d* m3 l8 {

: {3 q# L1 c9 R5 m./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了7 ^+ x9 \% c7 E: D' p

2 C6 ^# X' b$ i0 g* O8 z./coin printchain  x! H) m8 o9 S) A$ l

+ j/ U6 n& B7 U6 Q  p* k: @效果截图如下:
1 {& |; L! ]7 k3 A4 G. b& w" N# q' t9 U* ^" P2 C. }3 _
但是打印后发现只有创世区块,不知道是存储问题还是打印问题?
8 E6 l5 Q2 F1 j2 D8 n& \
* p6 w" g- Q( Z% O* Y9 Z  _1 m# z于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题( H- i$ Z9 W0 b) P

* ?* k! J( _( B" s+ [) f! N, ^) O就是打印问题。4 z9 o2 H$ O  a2 t6 y6 X$ @
! H( p- f1 {+ z& M
问题还没解决,明天再说吧。
# H& }; S( l6 G% S# v0 V
4 d/ a' K( |. `+ {语法- w4 ?- {( h8 q& Y5 J5 F6 Z( I
$ r( X9 h( R2 y( g! r% j5 D5 i
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。9 w7 J  p" z0 u! J
3 U; Q( ?2 s8 n, e. d8 {- B7 b
bytes.Join()和genesis.Serialize()的区别?& c- M" _+ B# {/ {  r) n

$ S0 N+ p, @4 s* k2 D3 R) F# a[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
! U, c( K7 }( |, E$ |7 j2 w, q
" P! A$ E/ A* ?, Q& fblock.Hash -> %x) w: v+ e( R" l( q0 A5 b% V- f

7 V3 z" o7 j: V5 o( y4 G# h7 r第一次用:=,之后不需要冒号:了
- V5 o/ |  |; i3 K8 h8 b# C( G" T$ B. b: j1 v5 y
defer bc.Db.Close()表示函数结束后再次执行这个语句。2 d% ?$ T  N) @3 z1 n

" ]4 W1 n- o# U  s- F& j成员函数都用小写开头。
6 ~3 [, r7 R) n* _8 j6 N( \
8 U# Y' b) r: R2 ?1 J成员数据都用大写开头。6 C* Q7 Q- }- `
0 @. u9 C  u% N% C- f; ]- T
strconf.FormatBool(pow.Validate())
6 l% t4 z$ F8 m4 ]7 }, L3 [  e5 M, c; Q# ]+ ?1 ]3 r4 g$ d- P, `, l
for {}
0 i& N+ [$ ^$ K8 H4 j; N( g' O% _+ S! ~" _+ q7 X! v
cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb9 ~, S: A5 R! v" A4 S" w* Z' R( E
' Q2 E! q- Z" k# G! q1 w
技巧
) \( X9 b2 j2 t6 b  p" O% _- }; m8 p8 l5 v  j5 F: C/ h9 ]1 F
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
* d6 F& L3 k/ G, \% `
$ Y6 u  p" _5 l相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1