Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
118 0 0
发币是什么意思?0 A6 D* K' n5 e+ O* A! J: Z

% F  M6 `' N# }* H" b问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储
7 F4 Z' ^0 G7 Q% Y% i* w7 d. n6 n
6 f7 X' {  Z, ]2 K改进方法:引入特殊的存储机制
1 T. P- `9 B% C* k" j0 N1 X9 [- b
, [# r& O$ o0 f+ H6 Y报错了,搞不明白,明明一模一样的,错误截图如下:
+ N$ s8 Q1 a. _" S/ P9 e" C5 B. ^6 k  l5 p' ^
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!7 y# f$ p. _; C) m0 ^

3 z% i6 d( e  W1 ?$ Y5 f一个block区块里面可以有多笔交易是什么意思?1 W& Y" C! z6 h6 g+ T: y
; z( l) f. e! ]) i1 l! |
合约和区块链什么关系?& m% N+ d* I% O$ A0 a5 E
" X- i. B- Z0 f+ T1 J4 w4 p# {
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78
) e# ^/ `/ t  }' p: I% {' p$ Q7 i! z
但是数据库内容还不知道对不对。
9 {! r/ l" O. c1 u$ P+ q# T5 l* A% S% L1 t( z
问题二:main函数太不优雅了,不灵活
, A& J% a% s8 Z. [- h) ?) }
6 F5 A4 t0 l  Z2 P( H把交易记录写入区块放到命令行做。, j6 N' ~$ i- v. C' P$ B

0 x! u, `, ^) q0 q1 P" d1 `交易记录和区块是什么关系?
+ \( S+ v+ v: I7 t; p4 N1 g5 c7 c  t
难道没次发生交易就要创建区块,那不是太麻烦了?* A! A# m5 e) Z5 t0 a1 K
2 Q, k' r* |8 z1 m, s. Y% o
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b, r2 [# |" Z% |! ?) g# H+ v
; J2 x) ^7 Y: i8 A: v
CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。. p- _2 @" B, H

/ o% x) i, \& X7 ?$ |4 R定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
; p) I6 V  x/ n+ j: ]/ Z8 Q
/ H- W( r7 K2 \func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155- u$ w3 k: o/ @' ^; y, d5 T+ E* w
0 \. [" g# S# w
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7
6 K9 S, g& ^) C1 w7 ~
$ j- c' f1 K$ t! u4 k. ~添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62
& Z7 D4 N& ?- e1 ~! }! ?6 U
; U  p! ]& _+ |这些方法又都是供Run()选择调用的* n1 _% v0 p* s4 z* B% \

6 k) G/ ]: ?0 ^& O! D' B$ E  s添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d+ v* Y3 r/ c7 t3 X& e8 T
1 a5 j3 H9 c1 k6 T
测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
! U  R+ U7 ]% o5 r- N, q! H5 ?- }; Y8 j' p1 }
./coin
' a% @4 ^$ |& e. P& K$ {* l' `) c& ?/ D( w' y9 h' o
./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
' n* d% I* v# M/ x0 I, X  ~4 e
% S* }7 _* f, w6 _' ~# a  `2 r./coin printchain- R9 ^: u; f4 B; P1 _$ O5 b# Y
  l) Q. V3 Z4 [: r
效果截图如下:: S# K2 \& Q' y2 l" l

$ T* u7 n- r9 C* I! ]) _0 e但是打印后发现只有创世区块,不知道是存储问题还是打印问题?! Y  q$ _+ d- c) l
+ H* y0 P% g: \
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题/ i( }6 A) U+ O7 x
8 ]- l& N( f& E/ R+ Q' n+ p
就是打印问题。
- X2 N0 q* W$ J, W# v( T3 Z4 d8 ~6 Z% E
+ p$ v  h: Z3 k$ h# ^/ q+ z8 O7 w问题还没解决,明天再说吧。
. @1 ^2 _1 _1 B" x7 M4 t" @6 \+ ~
& m. Y- D( V/ k0 y4 _5 G语法
8 c3 i! X8 T/ @) N
; C5 e  j) i8 S" ~% y1 }9 WGO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。
6 }  i/ W4 R/ o) g4 P% O( o% i4 B) i% O% N4 M; V
bytes.Join()和genesis.Serialize()的区别?0 K3 S* m$ `. f5 H

/ F- b' |4 ~( E- c9 v; X) L[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
& B: y! v$ K7 v/ V& m. U8 s5 g. @; n7 `) G0 r
block.Hash -> %x
- Z: B2 w# v5 r9 ]- D/ R1 K) h/ C2 |! s1 Z5 J! E6 c
第一次用:=,之后不需要冒号:了) p1 j; j- O$ ]7 {, ]2 l

7 u& k8 A2 ]: U4 K$ o8 D' j- Ydefer bc.Db.Close()表示函数结束后再次执行这个语句。( I1 A" ?7 E) X! o9 j$ a! G% }8 Q
0 k' d" M8 H, E- ]6 B
成员函数都用小写开头。8 N0 s$ k0 O) J( V) `+ t8 I

5 S3 S% k9 e/ x- Q. T8 l+ G成员数据都用大写开头。% k9 ]7 P, M4 u* _& i2 W

3 j+ W1 ^0 H2 T$ }strconf.FormatBool(pow.Validate())
7 K; t. g7 D3 N6 L% [# Q& f6 R; b; c
for {}
$ \$ k; Z' f3 U3 U% B/ k
( Q7 P/ I, L7 kcli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb
+ l  d) k+ h7 y, A0 S6 a
& C7 O& P5 c2 L/ F& M3 e( {技巧3 W# B1 }' @8 E$ |! G6 [, P. j! Y
. I# F& s+ w5 [7 Q& A) h+ \
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
0 {! p2 _7 h# m' V  r2 N3 H. `
- _, o0 n9 Q- e3 a- Z/ m相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1