Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

工作量证明实现代码笔记

jayquan
98 0 0
发币是什么意思?- R. C* c6 {. p) d7 Q/ L
8 ~: N, [& v$ ]* F4 G5 x
问题一:区块链是在内存上的,现在要搬到本地数据库/文件存储8 a7 I( |; F- c
* D4 g4 O$ P8 n" M. ~
改进方法:引入特殊的存储机制
3 w& Y) }4 t' Y% p1 s
0 k2 L) c+ }4 d" y/ t2 H9 r' f4 w8 {报错了,搞不明白,明明一模一样的,错误截图如下:' X2 v5 R: o  k6 _! v5 h
7 E  G- k+ p% U4 L
哈哈,通过在bolt库路径下搜Update找到用例了,发现是语法错了,这里是匿名函数啊!9 \" e$ z* U+ m9 O7 p  m* v

0 @0 E$ @3 U% S  L  d8 `一个block区块里面可以有多笔交易是什么意思?9 O( P6 T; B7 G# R0 t
' v5 {! g. P3 W
合约和区块链什么关系?6 k% q% ]! D7 s

8 l% _1 |8 G) \7 \  n完成数据库替换内存数据 f383d000df2c68b875f5cdbc233fb2ee20facd786 h5 B$ N2 W$ K0 ~

9 f( [9 I0 ^% f2 B8 V* V" `  X但是数据库内容还不知道对不对。
( S4 B0 K  W( R& }4 _
9 M) ~- H- G" B8 g问题二:main函数太不优雅了,不灵活
' e/ }" C* t$ \" G/ m
- ]0 `3 D5 o) S" @0 I把交易记录写入区块放到命令行做。6 z& m1 B5 u) K* ^

  \! _. _! W* B# B交易记录和区块是什么关系?
( j9 d" r9 I1 D# F; X' g+ p6 I5 j" j( k, u2 o  d# O! l
难道没次发生交易就要创建区块,那不是太麻烦了?+ L6 [4 Z+ u/ Q/ k" P, p
$ J. Q% l7 h4 x! B: K
main函数操作部分交给CLI执行 3521b35776fcad749fa8830494e68b6a50d5be3b/ J8 n! y! e/ G8 E& {) ~
' |7 @2 |. u; ]( w+ g; l, F
CLI可以理解为一个类,先是初始化/构造函数,然后就是和数据相关的操作了。
2 ~) T2 }9 ^8 }, c  U9 V8 q1 X% T. B, f5 G
定义CLI结构体 0c64883897b70aa42ffc6582e3350a4971ead5b8& L, |  O1 d. D2 j9 Q
# P7 |5 \. v9 n% B* F6 y. e/ _
func (cli *CLI) printUsage() 1383575d21e1c8c9dcd57f753877829835e0e155
6 x) b8 r: N+ {+ y  k# v
# R6 Q, Z3 D6 X. ]  @验证参数 6611b9309378d50ee40ca0c684fe400b0605a4a7# O0 U) K, X. I4 E

7 p( c0 y4 z7 b! \* T% V8 W添加新区块到区块链 c59a70a888b3d572245668f89beed2672f273d62
+ P0 A. d# `1 a$ T- M; L, O# _* b) `7 V4 o
这些方法又都是供Run()选择调用的' N4 l: z0 [6 N- }

$ s7 |1 S1 S$ q1 U- d9 S' O添加blockchain的迭代器,并配置Next方法 5c024d134cbbc60c4cc9ed87a9a980734d8dc54d# Q+ R' v" t( p2 j3 @! a1 c0 [9 a9 r
) a/ [2 X3 z  {" B* J: J# g
测试命令如下,此时的版本是 297618742b808e0b759a3481cf454dbfaa5f1f99
! D7 N. v9 T6 Q% o6 E& J, K$ L! @) K' m1 n% Q' H
./coin5 T8 J6 O" H& W6 l. n  x3 }, R# e: e/ @5 g

% u% ?3 u, g' H& Q./coin addblock -data “Pay 0.313 BTC for a coffee” 区块链被存储到本地数据库了* w1 n, T$ t; o$ G" W

1 c# O8 X$ }4 |./coin printchain
5 X  k8 A( c5 ?4 V; U* Z! q) U% B$ t9 z4 \) ~
效果截图如下:' g4 s3 L" E# I( s

7 f+ r! J9 Z$ y- z但是打印后发现只有创世区块,不知道是存储问题还是打印问题?
- ^" J8 `0 b* w+ _6 `: ?9 M# X# R, M8 e0 x  e' Y
于是我不断运行 ./coin addblock -data “Pay 0.313 BTC for a coffee” 发现文件大小是增加的,说明添加数据是没问题! A6 S( M7 f( T  F0 L; O" X
6 K! {. F7 ?: U" z) y
就是打印问题。
( j$ U$ C+ i: Z. D7 _; e7 F8 N: a) O% k4 M5 Z9 C  T2 d7 y! k) n
问题还没解决,明天再说吧。
6 b; n8 u( j! ^. P5 N* O' K) z
) m5 j0 g  h2 S  f8 z& F+ j语法1 s" V( V; Q& E

' l' N) o6 @, y! N  ?+ u# wGO语言真的很强大,包管理直接依托github.com,一个包就是一个文件夹,文件夹里面直接就是代码。" y6 l$ H) D, ]& |1 h! D5 v

9 L( k7 i0 l7 t+ n! wbytes.Join()和genesis.Serialize()的区别?
7 }% k3 q2 l/ J" Q" S  |+ W+ e! y( P3 w6 V5 Q
[]byte转换为string:hex.EncodeToString(block.Hash[:]) -> %s- X8 a0 z, v0 t0 {- q
1 i. t4 }8 {6 ]
block.Hash -> %x
  ^6 ]- h+ _7 T* `/ C9 i7 {6 Y, `0 A! a* P" Y9 Z
第一次用:=,之后不需要冒号:了
' R, C: p( f& w# u4 o% l/ F# @' x' N7 N- H* }  u; h* M
defer bc.Db.Close()表示函数结束后再次执行这个语句。% Y# q! k6 x# [3 q, w3 O& a! D
& R/ q7 z1 f/ |) @
成员函数都用小写开头。
3 L/ T3 b  C* t6 C
& i9 B4 w3 u/ U, P4 f0 Q成员数据都用大写开头。
; W. I9 i* I2 g/ o) n' O; i( {' p$ W6 I) X
strconf.FormatBool(pow.Validate())! N6 l- L% E) r! Y  ?" _& p' J

" _" c, Q! S/ f1 l  _4 ~for {}. Z  M: j# b. s0 m. o

' k6 s& c5 G( D- I3 K: acli := core.CLI{注意结构体初始化是花括号} b2459e54cea7c4e8a6a8f7bc11eb81b65ed50fbb0 a- v) I0 `* L& M
, @% t# L8 {; ?2 n
技巧
1 a' |! S0 Q1 L( ~# r' Y8 _/ H& o% F7 y6 F: R; G& j
复制仓库全路径https://github.com/boltdb/bolt,GoLand会自动询问是否安装。
1 c% H. i1 H( R& F5 G- ]( n  k; c& i  K8 i% N( H0 c
相当于执行 go get -t github.com/boltdb/bolt,安装的库在当前项目的src/github.com/boltdb/bolt下面,不会被git识别。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

jayquan 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1