Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
102 0 0
发币是什么意思?& t0 N  g9 W  n- m
7 h: R: u4 s3 r4 f3 T( y& a& R
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储8 \2 r  I3 Z' r9 l4 n
8 q6 s9 V; F$ h! q6 C; t* _
改进方法:引入特殊的存储机制: z7 w) v  S! t$ `% `* [  L; q
+ Y# T4 s- ?. a& k
报错了,搞不明白,明明一模一样的,错误截图如下:
1 l0 Z) P" Q  V# d1 L4 ?3 W0 e9 V5 X9 J6 q( z+ d
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!) H, E0 `, d8 V6 |$ s% c% }. S
: h; R- R" ]2 d. ^. ]3 _9 {4 i
一个block区块里面可以有多笔交易是什么意思?  K: o3 D! l0 p+ v$ E0 N7 g
. ^" `4 B5 p1 J7 Y
合约和区块链什么关系?
/ |  s' E8 A! S- a; C* c
$ C/ W9 S, B! F/ I' Z3 b完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78
: k: ?& k2 C& U$ z4 F) j1 v! Z; s' W- p: V! M
但是数据库内容还不知道对不对。
6 v5 w5 a" n) u
% o8 h& D+ [0 i' V8 W& A问题二:main函数太不优雅了,不灵活
0 l; n3 t* W; j0 D" y+ Q) i; \
/ C* _& e1 i8 I6 d- L0 b把交易记录写入区块放到命令行做。
0 G3 B/ z# n) l2 l2 A/ M& {  ^' D7 E$ b) O1 h
交易记录和区块是什么关系?
. [+ o# ^. z; `" a/ ?; G
' A. {7 r$ Y2 G% p难道没次发生交易就要创建区块,那不是太麻烦了?( v' Z, L' m- \. t& f1 q7 ~* _
4 c) P1 \: J0 ?9 _
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b8 `- T, w& W+ F. A0 ^5 q7 M
$ S4 {/ L2 `3 g* h: {
CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。' t# H" |- a9 T, z/ h% t! V

8 f5 G( V) A* o8 I2 k% @7 ]定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8
, U$ G9 J6 Z' p- [$ Y, _9 g) J6 }5 I# q. G3 q% o/ o1 T8 m+ c
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155# ~; e& |. b7 v  g* ~# Y
8 x) ~9 Q1 q! d$ s( G1 o
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7; ?" Q/ |1 O2 `

0 Y4 ]' w' f# m添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62
$ ~7 @/ h) {. h$ a3 O7 \4 H
7 r  G# |% v7 e8 I9 Y6 Z这些方法又都是供Run()选择调用的1 K. E2 \2 i, h+ q

% ^! b( @9 K$ v- G& \添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d
: N8 V9 r# i+ B
4 |# h# h# D( s1 V& q( b测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99( o5 X7 x- l: D1 n
/ a# Z; K8 h. I- z/ M$ @0 C
./coin, L; ^- A1 T5 ^7 {: g5 W
( v7 f+ |4 `* {# Q" J- m3 x
./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
1 O  Q! X9 i4 r7 I" w; Q0 c7 |( I
* D- P' I3 a$ p/ U8 R* G./coin printchain: C; Y8 c4 {5 N' U; [/ H9 ^

- {+ o9 d1 @3 A2 X3 @6 @: f0 d7 N3 _效果截图如下:' |8 }; S- w9 e6 j

8 f5 j$ {! ?: X/ }5 W但是打印后发现只有创世区块,不知道是存储问题还是打印问题?& H0 R9 q6 @4 I; t7 D' x/ ~
7 s; U1 x2 l% r& Q  X% a
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题
, a  u$ q( x# ^( l5 W1 b/ Q$ u3 a* P  Y0 r( O( Y( Y
就是打印问题。
  u7 m8 n- n4 E0 \' G( I
( |% @% t. G8 n2 x$ I问题还没解决,明天再说吧。
; {, F$ b& Z7 D$ X  `% C3 y6 G) \' J3 B6 S( j- i
语法
! `( J, Y: D0 s! Z
" N4 l: X9 w. ~. {6 g; mGO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。
$ o+ C6 i+ a) G% M: J1 H4 h' |' r5 B7 `: W$ S0 `7 M4 F! D
bytes.Join()和genesis.Serialize()的区别?
- f/ }# g6 B) s- Q( D  e) {& o- \5 H6 F
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s2 R- y( K0 k7 E

/ n: d% b5 {( c. @; Nblock.Hash -> %x! o; f7 k5 I4 W* W: m$ b6 q6 @
5 d* c! t' T) S2 c) C
第一次用:=,之后不需要冒号:了0 o) K7 Q, B1 i+ i3 N, n: L
3 d$ z5 i) g: ~2 l2 P, F
defer bc.Db.Close()表示函数结束后再次执行这个语句。" P' g/ U% d. c' L

2 w4 t2 v( b3 N( o! z% G1 \# a: T& ^成员函数都用小写开头。
' H! z. A0 Y: ~/ u  f, o5 n& K2 y' j) d9 F
成员数据都用大写开头。" T$ }( c, V* b3 l1 v! `: f" ~! h

4 A' z" o. c1 N1 m" fstrconf.FormatBool(pow.Validate())" y8 X& z7 M$ z) m9 X4 Z- n$ i  d
3 p5 m# \7 _- x; z1 W
for {}
2 ^* h6 Q. E9 q6 ]% G0 `; g5 V$ f7 x8 b8 N5 z) C
cli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb' z( f  l2 Z) F

' {3 R/ I8 W- e/ T: M: j. q; U' H技巧) x* ], b/ P0 A" E
0 _8 K2 Z' k. n% f. W
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。. N5 G/ L2 L, {

0 [- M2 [! G5 [; P相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1