Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
100 0 0
发币是什么意思?& c: c4 S/ Q0 ~9 y2 f  y

+ F) v2 ?, Q* H" @3 T  u6 S问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储. ^, w/ y) e0 k. Q8 Q2 M3 }  z

) y) ?' {7 @0 s) {  g0 M改进方法:引入特殊的存储机制/ o& @5 a5 e/ z- e" C0 k" j: p* i

- u; O+ ]! X( x报错了,搞不明白,明明一模一样的,错误截图如下:( W0 E* V9 x) W) [4 m
/ a( H1 q' y2 B8 Z# h
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!% |$ g. x; s$ ^2 P, [
3 K  W0 z2 h3 p% p  w4 M* [% O
一个block区块里面可以有多笔交易是什么意思?
- ^  H& \4 F, E# f6 I4 B" H9 R, i$ e5 b& u2 ^/ q
合约和区块链什么关系?0 c5 @& R4 t$ W! Z. R+ f* w; \
2 x# r+ X  l2 x3 T+ i. I3 c
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78( ~: H' C2 x8 K. T

% X# ^  J$ g. Q; h9 p) i, a! ?但是数据库内容还不知道对不对。
* G# I  m% W! `) S% E
) D# K3 @7 Y: J' [9 ?0 q问题二:main函数太不优雅了,不灵活
$ `2 R& W0 k" u4 M/ M/ s  g, g
; p  B& Y: E, ?5 y" B把交易记录写入区块放到命令行做。3 R0 t' ^5 y1 l* q7 W
1 T- C/ S: p7 s
交易记录和区块是什么关系?% O9 I. S  Y' a' ^! q4 R$ z% w

: `2 h5 y; a# i+ S4 l9 v难道没次发生交易就要创建区块,那不是太麻烦了?- S) i/ M! B8 v6 `2 M: H
) {1 E% j$ v2 U) @+ @/ b" ]
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b6 \7 `4 m0 S/ ?  b
, J( z* f( W; L/ x( \
CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
7 Y- |" s, ~( y3 u' S% L! k
0 H1 D3 G% [9 g2 i4 v定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
2 Q5 n) f% y7 P. Y5 X5 r' Z3 ^3 x" s, P$ m! i
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
8 `& L/ R6 O- |6 S0 L4 D1 C3 _0 ?/ h
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7" ]4 b" r' Y5 R9 m' X- a$ p

* K( S& O4 Y' n" P添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d628 _  X1 R$ D" v" _+ {) D7 Q, T; }* I

! N, l5 x) s2 g# H这些方法又都是供Run()选择调用的
6 N7 x4 o( D6 H( X+ u' S( [, F; j8 e" }, ]# c) d. }
添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d  N% k! r( P1 N% O

- l+ V6 {7 l9 _/ \$ P4 {测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99$ @' t" u5 }$ \# j" @
& Y+ S6 L9 ]  O( y' U
./coin
' g6 r8 {9 t- }2 C" X$ G1 e- k7 k0 {6 m" E1 a$ N
./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了" l4 l& {1 Z* @+ r  [4 K  m- Z

" t; t3 x" p5 ^& y* D./coin printchain
( N3 s1 q8 j) m' j' M/ K5 u
, Q* W& K. @' Y* T; i1 S7 K效果截图如下:
' ?4 C/ f/ ?  V# u7 X* [
( j) q* i5 V0 A- L/ C! w$ l! }6 t但是打印后发现只有创世区块,不知道是存储问题还是打印问题?+ |$ R3 g" s2 h5 }

/ W5 j) h7 l" E% V5 b, B) u于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题
5 x5 a" }: y- V
) a/ E: K# D" g0 V* U: c' y就是打印问题。9 J3 u* H2 e. }: d5 D# r
: L, e8 z+ I. A: E4 J0 f
问题还没解决,明天再说吧。. x% O  [" n7 f# o

: I' k6 X4 c  B3 ?1 n# L语法
. f) A( N. _! x( X3 J1 l4 Q1 @+ Y" @% b9 b0 L
GO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。
1 Z8 L% H9 M- U1 h8 ]7 M  ^5 N0 w" J1 m8 L$ I2 j2 `: w
bytes.Join()和genesis.Serialize()的区别?3 Q+ |. R* y$ A/ j0 l& c4 _- Q
3 `! ~# h5 {3 i+ Z
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
/ x" m. W. D1 e9 `
! s3 f0 e: `5 Q) ^% u# hblock.Hash -> %x- @! q4 G( N  a5 n  F9 v9 c( @- {# V

0 n1 a/ u& V# N! `) v/ L% l第一次用:=,之后不需要冒号:了' Q+ M' y5 D, D# v
7 h4 N" c' c4 r+ V9 I1 i- W
defer bc.Db.Close()表示函数结束后再次执行这个语句。# t/ v/ J# K, v7 E6 H1 W
: F6 T8 w( G6 ~/ o; U  x. Y
成员函数都用小写开头。
$ c/ i8 B! _) ]- H. E* p6 B" O7 m4 G) s1 h4 i
成员数据都用大写开头。, k3 z* W2 B6 u1 ~8 f

4 I0 O% S6 f& r9 ~7 a1 Z2 ?strconf.FormatBool(pow.Validate())& m( ]/ g# b8 Q/ a( t3 e! q1 u
! g  R& l! a& ]4 W3 P2 a
for {}6 Y( p: C& `% k+ a
3 B. w* U- s" e
cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb0 d8 e1 U+ s: ^' P
+ A8 q" N+ \$ e. D# I
技巧
0 e7 V" A4 `9 {! \; T8 W9 X8 X; U7 O( X: \4 }; |4 G0 e1 P& F
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
6 C, S' X' D/ d: b1 G  b/ y) s; c
相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1