当前位置:   article > 正文

通过命令行操作区块链的区块添加与查询

按照有参数区块序号查询区块数据命令是jet block by number该命令有几个参数

目录

  1. flag基本使用
  2. os.Args基本使用
  3. flag与os.Args组合使用
  4. 通过命令行添加/查询区块
  5. 测试代码与测试结果

一. flag基本使用

通常我们在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。在 go 标准库中提供了一个包:flag,方便进行命令行解析。

1.导入flag包

  1. import (
  2. "flag"
  3. )

2.使用示例

  1. //定义一个字符串flag,flag名为printchain,默认值为:hello BTC world,参数说明: 输出所有的区块信息
  2. flagString := flag.String("printchain", "hello BTC world", "输出所有的区块信息")
  3. //定义一个整型flag,flag名为:number ,默认值为:6 ,参数说明:输入一个整数
  4. flagInt := flag.Int("number", 6, "输出一个整数...")
  5. //定义一个布尔类型的flag,flag名为:open,默认值:false,参数说明:判断真假
  6. flagBool := flag.Bool("open", false, "判断真假...")
  7. //解析flag
  8. flag.Parse()
  9. //输入参数后的值
  10. fmt.Printf("%s\n", *flagString)
  11. fmt.Printf("%d\n", *flagInt)
  12. fmt.Printf("%t\n", *flagBool)

执行结果

  1. //编译main.go
  2. go build main.go

2.1 默认执行

  1. ./main //执行./main,输出所有flag的默认值
  2. hello BTC world
  3. 6
  4. false

2.2 .输入一个未定义的flag

  1. ./main -xx //xx并未定义,输出错误信息以及所有flag使用方法(通过flag.Parse()生效)
  2. flag provided but not defined: -xx
  3. Usage of ./main:
  4. -number int
  5. 输出一个整数... (default 6)
  6. -open
  7. 判断真假...
  8. -printchain string
  9. 输出所有的区块信息 (default "hello BTC world")

2.3 输入已定义的flag

  1. ./main -printchain //仅仅传入flag,提示flag需要一个参数值
  2. flag needs an argument: -printchain
  3. Usage of ./main:
  4. -number int
  5. 输出一个整数... (default 6)
  6. -open
  7. 判断真假...
  8. -printchain string
  9. 输出所有的区块信息 (default "hello BTC world")

2.4 输入已定义的flag以及对应类型的值

  1. ./main -printchain "hello bruce" //传入flag=printchain,value="hello bruce"
  2. hello bruce
  3. 6
  4. false
  5. ./main -number 88 //传入flag=number,value=88
  6. hello BTC world
  7. 88
  8. false
  9. ./main -open true //传入flag=open,value=true (默认为false,传入-open即为true)
  10. hello BTC world
  11. 6
  12. true

二.os.Args基本使用

os包提供了一些与操作系统交互的函数和变量,并且go对其做了一些封装。程序的命令行参数可以从os包的Args变量获取;os包外部使用os.Args访问该变量。

Go言里也采用左闭右开形式, 即,区间包括第一个索引元素,不包括最后一个, 因为这样可以简化逻辑。os.Args的第一个元素,os.Args[0], 是命令本身的名字;其它的元素则是程序启动时传给它的参数。

1.导入os包

import os
  1. 使用示例

    //实例化os.Args
    args := os.Args
    //打印args切片所有内容
    fmt.Printf("%v\n",args)
    //打印args切片的第二个参数
    fmt.Printf("%v\n",args[1])
    //打印args切片的第三个参数
    fmt.Printf("%v\n",args[2])

传入参数

  1. ./main arg1 arg2 //执行main程序,传入两个参数arg
  2. [./main arg1 arg2] //args
  3. arg1 //args[1]
  4. arg2 //args[2]

三.flag与os.Args组合使用

1.创建flag对象

  1. //通过flag.NewFlagSet实例化flag对象
  2. addBlockCmd := flag.NewFlagSet("addBlock", flag.ExitOnError)
  3. printChainCmd := flag.NewFlagSet("printChain", flag.ExitOnError)

2.拼接flag

flag名称:data

默认值:bruce

使用说明:交易数据

使用方法: ./main addBlock -data

flagAddBlockData := addBlockCmd.String("data", "bruce", "交易数据")

3.判断flag

  1. //判断os.Args中第二个flag的值
  2. switch os.Args[1] {
  3. case "addBlock":
  4. err := addBlockCmd.Parse(os.Args[2:])
  5. if err != nil {
  6. log.Panic(err)
  7. }
  8. case "printChain":
  9. err := printChainCmd.Parse(os.Args[2:])
  10. if err != nil {
  11. log.Panic(err)
  12. }
  13. default:
  14. printUsage()
  15. os.Exit(1)
  16. }

4.解析flag输出信息

  1. if addBlockCmd.Parsed() {
  2. if *flagAddBlockData == "" {
  3. printUsage()
  4. os.Exit(1)
  5. }
  6. fmt.Println(*flagAddBlockData)
  7. }
  8. if printChainCmd.Parsed() {
  9. fmt.Println("测试输出区块信息...")
  10. }

5.相关函数

5.1 打印使用说明

  1. func printUsage() {
  2. fmt.Println("Usage:")
  3. fmt.Println("\taddblock -data DATA -- 交易数据")
  4. fmt.Println("\tprintChain --输出区块信息")
  5. }

5.2 判断是否输入flag

  1. func isValid() {
  2. //如果args切片长度小于2(即没有跟参数,则打印使用方法并退出程序)
  3. if len(os.Args) < 2 {
  4. printUsage()
  5. os.Exit(1)
  6. }
  7. }

6.测试命令行

6.1 无参数

  1. ./main
  2. Usage:
  3. addBlock -data DATA -- 交易数据:
  4. printChain --输出区块信息

6.2 无效参数

  1. ./main xxx
  2. Usage:
  3. addBlock -data DATA -- 交易数据:
  4. printChain --输出区块信息

6.3 参数默认值

  1. ./main addBlock //输出flag=data的默认值bruce
  2. bruce
  3. ./main printChain //输出解析到printChain后打印的信息
  4. 测试输出区块信息...

6.4 指定参数

  1. ./main addBlock -data "brucefeng" //输出flag=data的输入值brucefeng
  2. brucefeng

四.通过命令行添加/查询区块

1.实现目标

  1. Usage:
  2. createblockchain -data DATA --交易数据
  3. addBlock -data DATA -- 交易数据
  4. printChain --输出区块信息

2.定义命令行属性与方法 CLI.go

2.1 导入相关包

  1. import (
  2. "fmt"
  3. "os"
  4. "flag"
  5. "log"
  6. )

2.2 定义结构体

type CLI struct{}

2.3 打印帮助提示

  1. func printUsage() {
  2. fmt.Println("Usage:")
  3. fmt.Println("\tcreateblockchain -data DATA --交易数据")
  4. fmt.Println("\taddBlock -data DATA -- 交易数据")
  5. fmt.Println("\tprintChain --输出区块信息")
  6. }

2.4 判断参数输入是否合法

  1. func isValid() {
  2. if len(os.Args) < 2 {
  3. printUsage()
  4. os.Exit(1)
  5. }
  6. }

2.5 定义创世区块的方法

  1. func (cli *CLI) createGenenisBlockChain(data string) {
  2. CreateBlockChainWithGenesisBlock(data)
  3. }

2.6 定义普通区块的方法

  1. func (cli *CLI) addBlock(data string) {
  2. //判断数据库是否存在
  3. if !DBExists() {
  4. fmt.Println("当前不存在区块链,请先创建创世区块")
  5. os.Exit(1)
  6. }
  7. //通过BlockChainObject()函数获取一个block
  8. blockchain := BlockChainObject()
  9. defer blockchain.DB.Close()
  10. //通过blockchain的AddBlockChain方法添加区块
  11. blockchain.AddBlockChain(data)
  12. }

2.7 定义遍历区块的方法

  1. func (cli *CLI) printChain() {
  2. //判断数据库是否存在
  3. if !DBExists() {
  4. fmt.Println("当前不存在区块链")
  5. os.Exit(1)
  6. }
  7. blockchain := BlockChainObject()
  8. defer blockchain.DB.Close()
  9. blockchain.PrintChain()
  10. }

2.8 定义命令行参数方法集合

  1. func (cli *CLI) Run() {
  2. //1.判断命令行参数是否合法
  3. isValid()
  4. //2.通过flag.NewFlagSet实例化三个flag对象
  5. //创建创世区块
  6. createBlockCmd := flag.NewFlagSet("createblockchain", flag.ExitOnError)
  7. //创建普通区块
  8. addBlockCmd := flag.NewFlagSet("addBlock", flag.ExitOnError)
  9. //遍历打印区块信息
  10. printChainCmd := flag.NewFlagSet("printChain", flag.ExitOnError)
  11. //3.定义命令行对象的相关属性
  12. flagCreateBlockChainWithData := createBlockCmd.String("data", "", "交易数据")
  13. flagAddBlockData := addBlockCmd.String("data", "", "交易数据")
  14. //4.根据参数值决定进行解析的信息
  15. switch os.Args[1] {
  16. case "createblockchain":
  17. err := createBlockCmd.Parse(os.Args[2:])
  18. if err != nil {
  19. log.Panic(err)
  20. }
  21. case "addBlock":
  22. err := addBlockCmd.Parse(os.Args[2:])
  23. if err != nil {
  24. log.Panic(err)
  25. }
  26. case "printChain":
  27. err := printChainCmd.Parse(os.Args[2:])
  28. if err != nil {
  29. log.Panic(err)
  30. }
  31. default:
  32. printUsage()
  33. os.Exit(1)
  34. }
  35. //5. 判断是否解析成功 Parsed reports whether f.Parse has been called.
  36. //5.1 如果createBlockCmd解析成功,输出的DATA的值作为创建创世区块的传入参数
  37. if createBlockCmd.Parsed() {
  38. if *flagCreateBlockChainWithData == "" {
  39. fmt.Println("创世区块交易数据不能为空")
  40. printUsage()
  41. os.Exit(1)
  42. }
  43. //调用createGenenisBlockChain()方法创建创世区块
  44. cli.createGenenisBlockChain(*flatCreateBlockChainWithData)
  45. }
  46. //5.2 如果addBlockCmd解析成功,输出的DATA的值作为创建新区块的传入参数
  47. if addBlockCmd.Parsed() {
  48. if *flagAddBlockData == "" {
  49. fmt.Println("创建区块交易数据不能为空")
  50. printUsage()
  51. os.Exit(1)
  52. }
  53. //调用addBlock方法创建区块
  54. cli.addBlock(*flagAddBlockData)
  55. }
  56. //5.3 如果printChainCmd解析成功,调用遍历区块链的方法
  57. if printChainCmd.Parsed() {
  58. cli.printChain()
  59. }
  60. }

2.9 代码整合

  1. package BLC
  2. import (
  3. "fmt"
  4. "os"
  5. "flag"
  6. "log"
  7. )
  8. type CLI struct{}
  9. func printUsage() {
  10. fmt.Println("Usage:")
  11. fmt.Println("\tcreateblockchain -data DATA --交易数据")
  12. fmt.Println("\taddBlock -data DATA -- 交易数据")
  13. fmt.Println("\tprintChain --输出区块信息")
  14. }
  15. func isValid() {
  16. if len(os.Args) < 2 {
  17. printUsage()
  18. os.Exit(1)
  19. }
  20. }
  21. func (cli *CLI) addBlock(data string) {
  22. if !DBExists() {
  23. fmt.Println("数据库不存在")
  24. os.Exit(1)
  25. }
  26. blockchain := BlockChainObject()
  27. defer blockchain.DB.Close()
  28. blockchain.AddBlockChain(data)
  29. }
  30. func (cli *CLI) printChain() {
  31. if !DBExists() {
  32. fmt.Println("数据库不存在")
  33. os.Exit(1)
  34. }
  35. blockchain := BlockChainObject()
  36. defer blockchain.DB.Close()
  37. blockchain.PrintChain()
  38. }
  39. func (cli *CLI) createGenenisBlockChain(data string) {
  40. CreateBlockChainWithGenesisBlock(data)
  41. }
  42. func (cli *CLI) Run() {
  43. isValid()
  44. addBlockCmd := flag.NewFlagSet("addBlock", flag.ExitOnError)
  45. printChainCmd := flag.NewFlagSet("printChain", flag.ExitOnError)
  46. createBlockCmd := flag.NewFlagSet("createblockchain", flag.ExitOnError)
  47. flagAddBlockData := addBlockCmd.String("data", "", "交易数据")
  48. flagCreateBlockChainWithData := createBlockCmd.String("data", "", "交易数据")
  49. switch os.Args[1] {
  50. case "addBlock":
  51. err := addBlockCmd.Parse(os.Args[2:])
  52. if err != nil {
  53. log.Panic(err)
  54. }
  55. case "printChain":
  56. err := printChainCmd.Parse(os.Args[2:])
  57. if err != nil {
  58. log.Panic(err)
  59. }
  60. case "createblockchain":
  61. err := createBlockCmd.Parse(os.Args[2:])
  62. if err != nil {
  63. log.Panic(err)
  64. }
  65. default:
  66. printUsage()
  67. os.Exit(1)
  68. }
  69. if addBlockCmd.Parsed() {
  70. if *flagAddBlockData == "" {
  71. printUsage()
  72. os.Exit(1)
  73. }
  74. cli.addBlock(*flagAddBlockData)
  75. }
  76. if printChainCmd.Parsed() {
  77. cli.printChain()
  78. }
  79. if createBlockCmd.Parsed() {
  80. if *flagCreateBlockChainWithData == "" {
  81. fmt.Println("交易数据不能为空")
  82. printUsage()
  83. os.Exit(1)
  84. }
  85. cli.createGenenisBlockChain(*flagCreateBlockChainWithData)
  86. }
  87. }

3.生成区块链方法改造 BlockChain.go

3.1 定义判断数据库是否存在的方法

  1. func DBExists() bool {
  2. if _, err := os.Stat(dbName); os.IsNotExist(err) {
  3. return false
  4. }
  5. return true
  6. }

3.2 定义返回BlockChain对象

  1. func BlockChainObject() *BlockChain {
  2. //定义tip用于存储从数据库中获取到的最新区块的Hash值
  3. var tip []byte
  4. //打开数据库
  5. db, err := bolt.Open(dbName, 0600, nil)
  6. if err != nil {
  7. log.Fatal(err)
  8. }
  9. //通过key="l"获取value值(最新区块的Hash值)
  10. err = db.View(func(tx *bolt.Tx) error {
  11. //获取表对象
  12. b := tx.Bucket([]byte(blockTableName))
  13. if b != nil {
  14. //获取最新区块的Hash值
  15. tip = b.Get([]byte("l"))
  16. }
  17. return nil
  18. })
  19. //返回保存最新区块Hash信息的BlockChain对象
  20. return &BlockChain{tip, db}
  21. }

3.3 创建带有创世区块的区块链

  1. func CreateBlockChainWithGenesisBlock(data string) {
  2. //判断数据库是否存在
  3. if DBExists() {
  4. fmt.Println("创世区块已经存在")
  5. os.Exit(1)
  6. }
  7. //打开数据库
  8. db, err := bolt.Open(dbName, 0600, nil)
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. err = db.Update(func(tx *bolt.Tx) error {
  13. //创建数据库表
  14. b, err := tx.CreateBucket([]byte(blockTableName))
  15. if err != nil {
  16. log.Panic(err)
  17. }
  18. if b != nil {
  19. //创建创世区块
  20. genesisBlock := CreateGenesisBlock(data)
  21. //将创世区块存储至表中
  22. err := b.Put(genesisBlock.Hash, genesisBlock.Serialize())
  23. if err != nil {
  24. log.Panic(err)
  25. }
  26. //存储最新的区块链的hash
  27. err = b.Put([]byte("l"), genesisBlock.Hash)
  28. if err != nil {
  29. log.Panic(err)
  30. }
  31. }
  32. return nil
  33. })
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. }

3.4 创建添加区块的方法

  1. func (blc *BlockChain) AddBlockChain(data string) {
  2. err := blc.DB.Update(func(tx *bolt.Tx) error {
  3. //1.获取表
  4. b := tx.Bucket([]byte(blockTableName))
  5. //2.创建新区块
  6. if b != nil {
  7. //获取最新区块
  8. byteBytes := b.Get(blc.Tip)
  9. //反序列化
  10. block := DeserializeBlock(byteBytes)
  11. //3. 将区块序列化并且存储到数据库中
  12. newBlock := NewBlock(data, block.Height+1, block.Hash)
  13. err := b.Put(newBlock.Hash, newBlock.Serialize())
  14. if err != nil {
  15. log.Panic(err)
  16. }
  17. //4.更新数据库中"l"对应的Hash
  18. err = b.Put([]byte("l"), newBlock.Hash)
  19. if err != nil {
  20. log.Panic(err)
  21. }
  22. //5. 更新blockchain的Tip
  23. blc.Tip = newBlock.Hash
  24. }
  25. return nil
  26. })
  27. if err != nil {
  28. log.Panic(err)
  29. }
  30. }

3.5 遍历区块链的方法

  1. func (blc *BlockChain) PrintChain() {
  2. blockchainIterator := blc.Iterator()
  3. for {
  4. block := blockchainIterator.Next()
  5. fmt.Printf("Height:%d\n", block.Height)
  6. fmt.Printf("PreBlockHash:%x\n", block.PreBlockHash)
  7. fmt.Printf("Data:%s\n", block.Data)
  8. fmt.Printf("TimeStamp:%s\n", time.Unix(block.TimeStamp, 0).Format("2006-01-02 03:04:05 PM"))
  9. fmt.Printf("Hash:%x\n", block.Hash)
  10. fmt.Printf("Nonce:%d\n", block.Nonce)
  11. var hashInt big.Int
  12. hashInt.SetBytes(block.PreBlockHash)
  13. if big.NewInt(0).Cmp(&hashInt) == 0 {
  14. break
  15. }
  16. }
  17. }

3.6 代码整合

  1. package BLC
  2. import (
  3. "github.com/boltdb/bolt"
  4. "log"
  5. "math/big"
  6. "fmt"
  7. "time"
  8. "os"
  9. )
  10. const dbName = "blockchain.db" //数据库名
  11. const blockTableName = "blocks" //表名
  12. type BlockChain struct {
  13. Tip []byte //区块链里面最后一个区块的Hash
  14. DB *bolt.DB //数据库
  15. }
  16. //迭代器
  17. func (blockchain *BlockChain) Iterator() *BlockChainIterator {
  18. return &BlockChainIterator{blockchain.Tip, blockchain.DB}
  19. }
  20. //判断数据库是否存在
  21. func DBExists() bool {
  22. if _, err := os.Stat(dbName); os.IsNotExist(err) {
  23. return false
  24. }
  25. return true
  26. }
  27. func (blc *BlockChain) PrintChain() {
  28. blockchainIterator := blc.Iterator()
  29. for {
  30. block := blockchainIterator.Next()
  31. fmt.Printf("Height:%d\n", block.Height)
  32. fmt.Printf("PreBlockHash:%x\n", block.PreBlockHash)
  33. fmt.Printf("Data:%s\n", block.Data)
  34. fmt.Printf("TimeStamp:%s\n", time.Unix(block.TimeStamp, 0).Format("2006-01-02 03:04:05 PM"))
  35. fmt.Printf("Hash:%x\n", block.Hash)
  36. fmt.Printf("Nonce:%d\n", block.Nonce)
  37. var hashInt big.Int
  38. hashInt.SetBytes(block.PreBlockHash)
  39. if big.NewInt(0).Cmp(&hashInt) == 0 {
  40. break
  41. }
  42. }
  43. }
  44. //
  45. func (blc *BlockChain) AddBlockChain(data string) {
  46. err := blc.DB.Update(func(tx *bolt.Tx) error {
  47. //1.获取表
  48. b := tx.Bucket([]byte(blockTableName))
  49. //2.创建新区块
  50. if b != nil {
  51. //获取最新区块
  52. byteBytes := b.Get(blc.Tip)
  53. //反序列化
  54. block := DeserializeBlock(byteBytes)
  55. //3. 将区块序列化并且存储到数据库中
  56. newBlock := NewBlock(data, block.Height+1, block.Hash)
  57. err := b.Put(newBlock.Hash, newBlock.Serialize())
  58. if err != nil {
  59. log.Panic(err)
  60. }
  61. //4.更新数据库中"l"对应的Hash
  62. err = b.Put([]byte("l"), newBlock.Hash)
  63. if err != nil {
  64. log.Panic(err)
  65. }
  66. //5. 更新blockchain的Tip
  67. blc.Tip = newBlock.Hash
  68. }
  69. return nil
  70. })
  71. if err != nil {
  72. log.Panic(err)
  73. }
  74. }
  75. //1.创建带有创世区块的区块链
  76. func CreateBlockChainWithGenesisBlock(data string) {
  77. //判断数据库是否存在
  78. if DBExists() {
  79. fmt.Println("创世区块已经存在")
  80. os.Exit(1)
  81. }
  82. //打开数据库
  83. db, err := bolt.Open(dbName, 0600, nil)
  84. if err != nil {
  85. log.Fatal(err)
  86. }
  87. err = db.Update(func(tx *bolt.Tx) error {
  88. //创建数据库表
  89. b, err := tx.CreateBucket([]byte(blockTableName))
  90. if err != nil {
  91. log.Panic(err)
  92. }
  93. if b != nil {
  94. //创建创世区块
  95. genesisBlock := CreateGenesisBlock(data)
  96. //将创世区块存储至表中
  97. err := b.Put(genesisBlock.Hash, genesisBlock.Serialize())
  98. if err != nil {
  99. log.Panic(err)
  100. }
  101. //存储最新的区块链的hash
  102. err = b.Put([]byte("l"), genesisBlock.Hash)
  103. if err != nil {
  104. log.Panic(err)
  105. }
  106. }
  107. return nil
  108. })
  109. if err != nil {
  110. log.Fatal(err)
  111. }
  112. }
  113. //返回BlockChain对象
  114. func BlockChainObject() *BlockChain {
  115. var tip []byte
  116. //打开数据库
  117. db, err := bolt.Open(dbName, 0600, nil)
  118. if err != nil {
  119. log.Fatal(err)
  120. }
  121. err = db.View(func(tx *bolt.Tx) error {
  122. b := tx.Bucket([]byte(blockTableName))
  123. if b != nil {
  124. //读取最新区块的Hash
  125. tip = b.Get([]byte("l"))
  126. }
  127. return nil
  128. })
  129. return &BlockChain{tip, db}
  130. }
  1. 未改造代码块
  • Block.go
  • BlockChainItertor.go
  • help.go
  • ProofOfWork.go

以上未改造代码可以参考:【Golang区块链开发003】区块序列化存储

https://mp.weixin.qq.com/s?__biz=MzA4Mzg5NTEyOA==&mid=2651781600&idx=1&sn=ce72dd45079759dd004be83ed3f9f90c&chksm=84152fd7b362a6c18d1b752b8ffc14d07a057dd4f263c14c3058a822a7b74f7ae7bcb9eb1cd2#rd

五.测试代码与测试结果

  1. 测试代码main.go

    func main() {
    //初始化CLI对象
    cli := BLC.CLI{}
    fmt.Println("====返回结果======")
    //执行Run命令调用对应参数对应的方法
    cli.Run()
    }

2.测试结果

2.1 无参数执行

  1. ./main //直接执行
  2. ====返回结果======
  3. Usage:
  4. createblockchain -data DATA --交易数据
  5. addBlock -data DATA -- 交易数据
  6. printChain --输出区块信息

2.2 首次遍历区块链

  1. ./main printChain
  2. ====返回结果======
  3. 当前不存在区块链

2.3 首次添加普通区块

  1. ./main addBlock 或者 ./main addBlock -data "bruce"
  2. ====返回结果======
  3. 当前不存在区块链,请先创建创世区块

2.4 创建创世区块

  1. ./main createblockchain --data "Create Genenis Block 20180708"
  2. ====返回结果======
  3. 1个区块,挖矿成功:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  4. 2018-07-08 22:03:23.939771259 +0800 CST m=+0.087935424

2.5 遍历区块链

  1. ./main printChain
  2. ====返回结果======
  3. Height:1
  4. PreBlockHash:0000000000000000000000000000000000000000000000000000000000000000
  5. Data:Create Genenis Block 20180708
  6. TimeStamp:2018-07-08 10:03:23 PM
  7. Hash:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  8. Nonce:61212

2.6 添加区块

  1. ./main addBlock -data "bruce"
  2. ====返回结果======
  3. 2个区块,挖矿成功:000081872fe39a35be79e30f915c9716b9bbbae74f665fdd53f4ab57ae4b379d
  4. 2018-07-08 22:06:27.642330532 +0800 CST m=+0.055636890

2.7 遍历区块链

  1. ./main printChain
  2. ====返回结果======
  3. Height:2
  4. PreBlockHash:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  5. Data:bruce
  6. TimeStamp:2018-07-08 10:06:27 PM
  7. Hash:000081872fe39a35be79e30f915c9716b9bbbae74f665fdd53f4ab57ae4b379d
  8. Nonce:39906
  9. Height:1
  10. PreBlockHash:0000000000000000000000000000000000000000000000000000000000000000
  11. Data:Create Genenis Block 20180708
  12. TimeStamp:2018-07-08 10:03:23 PM
  13. Hash:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  14. Nonce:61212

2.8 添加多个区块

  1. ./main addBlock -data "bruce"
  2. ./main addBlock -data "send 100 BTC TO bruce"
  3. ......
  4. 3个区块,挖矿成功:0000565d60b6a26b8fc238bfeffb2cc1de20d28ca2a312bef9601997bb914fc3
  5. 2018-07-08 22:09:52.644353193 +0800 CST m=+0.032078853
  6. 4个区块,挖矿成功:0000dd1354cc868b96aeb18360b320b7a30ea0c00b27b79c32c0d9269ff2dbb3
  7. 2018-07-08 22:10:22.805477297 +0800 CST m=+0.210806453

2.9 遍历整个区块链

  1. ./main printChain
  2. ====返回结果======
  3. Height:6
  4. PreBlockHash:000019ba65a19b26f81fae22025e963e68a6cf0983fb211aae208c428368252d
  5. Data:bruce send 30 BTC TO jackma
  6. TimeStamp:2018-07-08 10:12:57 PM
  7. Hash:0000e3ba0e34ace19cba574deefdf5b75315b2ce10e488332952544e5a056571
  8. Nonce:3502
  9. Height:5
  10. PreBlockHash:0000dd1354cc868b96aeb18360b320b7a30ea0c00b27b79c32c0d9269ff2dbb3
  11. Data:bruce send 50 BTC TO ponyma
  12. TimeStamp:2018-07-08 10:12:44 PM
  13. Hash:000019ba65a19b26f81fae22025e963e68a6cf0983fb211aae208c428368252d
  14. Nonce:80833
  15. Height:4
  16. PreBlockHash:0000565d60b6a26b8fc238bfeffb2cc1de20d28ca2a312bef9601997bb914fc3
  17. Data:send 100 BTC TO bruce
  18. TimeStamp:2018-07-08 10:10:22 PM
  19. Hash:0000dd1354cc868b96aeb18360b320b7a30ea0c00b27b79c32c0d9269ff2dbb3
  20. Nonce:182779
  21. Height:3
  22. PreBlockHash:000081872fe39a35be79e30f915c9716b9bbbae74f665fdd53f4ab57ae4b379d
  23. Data:bruce
  24. TimeStamp:2018-07-08 10:09:52 PM
  25. Hash:0000565d60b6a26b8fc238bfeffb2cc1de20d28ca2a312bef9601997bb914fc3
  26. Nonce:21138
  27. Height:2
  28. PreBlockHash:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  29. Data:bruce
  30. TimeStamp:2018-07-08 10:06:27 PM
  31. Hash:000081872fe39a35be79e30f915c9716b9bbbae74f665fdd53f4ab57ae4b379d
  32. Nonce:39906
  33. Height:1
  34. PreBlockHash:0000000000000000000000000000000000000000000000000000000000000000
  35. Data:Create Genenis Block 20180708
  36. TimeStamp:2018-07-08 10:03:23 PM
  37. Hash:0000d5b050b448b6db0d273b9320036f93b7cb2e8f8005c1e6192dc91b4a3381
  38. Nonce:61212

2.10 测试重新创建区块结构

  1. ./main createblockchain -data "第二次创建创世区块"
  2. ====返回结果======
  3. 创世区块已经存在
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号