Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
103 0 0
发币是什么意思?* X% ^3 Y; }( e! L/ e
9 o4 w9 F' L! b' m
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储  h$ Y2 @# u- |7 s6 z! q5 E) k

7 V' ^# V& W3 d+ |3 u改进方法:引入特殊的存储机制
) n  k# j9 D5 q& X6 [- h+ ^* t6 t
+ c2 W- T7 G- l! q& J7 ?8 c报错了,搞不明白,明明一模一样的,错误截图如下:
* a9 c! y( o& K: n. J. M4 r8 ~" Q0 ^% P9 L; I+ L5 J
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!1 p' D) Y% V6 k
! G" N2 D, u" s
一个block区块里面可以有多笔交易是什么意思?
2 |. |, k5 u3 ^9 G
& m9 E& J# l, Y  n% q5 y合约和区块链什么关系?, G" w& {1 D2 z. ^5 j5 l
" Z4 |+ s) \0 @, I& z6 k% t. l, D
完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd78' M+ R- M1 R0 \9 z2 i
. x9 g/ Z+ g! I; x( @3 v$ Z! P5 g
但是数据库内容还不知道对不对。
8 P& ~0 q& W0 o8 _% l) {
7 ]+ b  m' y3 ?问题二:main函数太不优雅了,不灵活7 h0 S: e7 p& Q, {5 H' n

; ~* k' f# H% z; r& m. q把交易记录写入区块放到命令行做。' F. {: O4 t1 ]' }) R
' d, p0 ?& w) k9 P' B) m
交易记录和区块是什么关系?- |0 a! b( ^/ L9 ^9 Z. d/ B1 I
' |% x3 U  G( _" I6 q
难道没次发生交易就要创建区块,那不是太麻烦了?( j- E! r6 |+ R8 P+ x3 q% q
9 Z! l4 D- z. O" ^
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b$ X  M7 ?8 ^. O1 l4 a: V0 ]" \+ d# K( K

% K6 |9 r- Q0 o* qCLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。7 B! o* G. H3 Z
5 z  F' r  x: n- e* }1 y
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8  r& b% E/ ]+ F
6 _  s& R5 l/ O9 a( d/ Z9 f9 O) f
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
$ y* u  f: B: l6 }0 W7 k7 c. r6 [! q. |7 Y. R
验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7, `+ G2 f+ }: b( i$ ?
3 P- W4 F* M/ Y- S8 D, ~* R
添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62: b$ F- @1 |( y
5 l8 d, L, q' L
这些方法又都是供Run()选择调用的
  ]3 T$ m, J/ @9 x( u8 r2 ^' z  I$ H
添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d& g* L  j1 ^& V
: V& H/ M4 T$ T* |. k, v/ P
测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f993 p# W& Y- U& @8 @6 x
$ k. t. e7 ~' t5 w, O
./coin
# C" k7 n5 I4 J  K+ |6 _
0 x0 F& z8 r7 S. I0 s6 ~! c./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了
, x7 _1 y$ Y6 Z3 m" k# A8 J$ w
6 o; ?7 l* P$ V./coin printchain1 ~6 n7 u9 ?& ~! K- z- u+ n

. j+ `7 L2 F; N( I4 e效果截图如下:
/ \3 d7 T5 x' j2 ~2 k" p+ v- L" [; m/ r2 L* H. o6 b
但是打印后发现只有创世区块,不知道是存储问题还是打印问题?
' B; \5 ?9 t. p. v. W" M3 }- n' z: Y! h
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题
0 V, e; b' `. J2 P1 I( N
# w! i# @; A- ]& ~9 i就是打印问题。7 F3 d( c; r  T
( |9 Y1 U" ?) ^* @& ?
问题还没解决,明天再说吧。
1 r# z: f. B. v3 b/ V2 `3 B, c
语法
, V8 R: _5 a5 e* ?5 w1 N7 g7 q' x
9 y4 b  A  l1 {( ^# A  g3 E- nGO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。/ Z/ x9 |! d* X" [9 r
% h9 w( N- [% O1 |) x) e+ g( B% s
bytes.Join()和genesis.Serialize()的区别?  F1 ^( Z4 Q! Z+ @

* M, h7 L0 N" l. X8 G4 {  W[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s
3 a2 |* {9 m/ y1 M( A4 s( ?5 F2 y" v- ^+ O) j! G4 Q6 j8 ~+ g
block.Hash -> %x' S7 j  `3 D8 {- r; R& ~4 ^, c

) H3 V5 b( s  k; l& L" w7 T第一次用:=,之后不需要冒号:了, |- T' w- z( t. K( h7 g, A- W- A6 s' W

( U3 [% L% x7 s9 n0 E( [/ ^( Hdefer bc.Db.Close()表示函数结束后再次执行这个语句。
  ~; C) H8 ^0 u7 \5 y( m
6 P' g/ \! q3 m( x8 E成员函数都用小写开头。
$ z& z6 G5 U7 k/ L/ E7 p' B' A2 J- p; f7 H: Q5 T
成员数据都用大写开头。
8 E8 S2 I" O  Z7 o7 f3 Y
- }7 ]) H9 l, A9 [1 lstrconf.FormatBool(pow.Validate())) h+ ^7 `( P2 i* r, U; d  R
; F( Z# j; Z* L1 h# \; \1 n
for {}9 E+ Y1 q. D$ z

; k$ p0 E) [, ?" f' _0 ocli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb$ E1 P4 b3 I  v: A

6 d2 _. w& G9 q) Q: G5 _& ~技巧
/ S1 h5 m+ {# R; n; A/ S) w, R% x3 C
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。. n' F- M6 B+ W* Q7 ]$ X- ]

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

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1