首页 > 区块链 > 兄弟连区块链培训教程分享CLI命令行接口
终极说法  

兄弟连区块链培训教程分享CLI命令行接口

摘要:区块链第三方接口直到现在,我们的实现还没有提供任何操作接口给外界使用。我们先前的例子中在 main 函数中执行新建区块链 NewBlockchain,还有新增区块 bc.AddBlock 的方法。现在可以改善,增加命令行操作接口了。我们需要如下这样的命令:$ blockchain_go addblo

直到如今,大家的完成都还没给予一切实际操作插口给外部应用。大家此前的事例中在 main 函数公式中实行新创建区块链 NewBlockchain,也有新增加区块 bc.AddBlock 的方式。现在可以改进,提升命令行实际操作插口了。大家必须如下所示这种的命令:

兄弟连区块链培训教程分享CLI命令行接口

$ blockchain_go addblock “Pay 0.031337 for a coffee”

$ blockchain_go printchain

全部的命令行关系的操作方法会被 CLI 构造解决:

type CLI struct {

bc *Blockchain

}

在 Run中添加CLI的接入点:

func (cli *CLI) Run() {

cli.validateArgs()

addBlockCmd := flag.NewFlagSet("addblock", flag.ExitOnError)

printChainCmd := flag.NewFlagSet("printchain", flag.ExitOnError)

addBlockData := addBlockCmd.String("data", "", "Block data")

switch os.Args[1] {

case "addblock":

err := addBlockCmd.Parse(os.Args[2:])

case "printchain":

err := printChainCmd.Parse(os.Args[2:])

default:

cli.printUsage()

os.Exit(1)

}

if addBlockCmd.Parsed() {

if *addBlockData == "" {

addBlockCmd.Usage()

os.Exit(1)

}

cli.addBlock(*addBlockData)

}

if printChainCmd.Parsed() {

cli.printChain()

}

}

应用规范的 flag 分析这种参数

addBlockCmd := flag.NewFlagSet("addblock", flag.ExitOnError)

printChainCmd := flag.NewFlagSet("printchain", flag.ExitOnError)

addBlockData := addBlockCmd.String("data", "", "Block data")

最先,建立两个子命令, addblock 和 printfchain,用 -add 标识做为 addblock 的参数数据信息标志。printfchain 不用参数:

switch os.Args[1] {

case "addblock":

err := addBlockCmd.Parse(os.Args[2:])

case "printchain":

err := printChainCmd.Parse(os.Args[2:])

default:

cli.printUsage()

os.Exit(1)

}

检验客户键入的参数和分析有关的 flag 子命令。

if addBlockCmd.Parsed() {

if *addBlockData == "" {

addBlockCmd.Usage()

os.Exit(1)

}

cli.addBlock(*addBlockData)

}

if printChainCmd.Parsed() {

cli.printChain()

}

分析出的子命令该实行的相关函数:

func (cli *CLI) addBlock(data string) {

cli.bc.AddBlock(data)

fmt.Println("Success!")

}

func (cli *CLI) printChain() {

bci := cli.bc.Iterator()

for {

block := bci.Next()

fmt.Printf("Prev. hash: %x", block.PrevBlockHash)

fmt.Printf("Data: %s", block.Data)

fmt.Printf("Hash: %x", block.Hash)

pow := NewProofOfWork(block)

fmt.Printf("PoW: %s", strconv.FormatBool(pow.Validate()))

fmt.Println()

if len(block.PrevBlockHash) == 0 {

break

}

}

}

如今的编码很像大家之些写的这些。较为不一样的是如今应用的是 BlockchainIterator去解析xml全部区块链中的区块。

最终改动 main 函数公式:

func main() {

bc := NewBlockchain()

defer bc.db.Close()

cli := CLI{bc}

cli.Run()

}

留意,第一次实行时,假如BoltDB中并没有区块链,则无论键入哪些参数,都是会建立一个区块链。

现在可以检验一下咱们的编码是不是工作中OK了:

先安装BoltDB

$ go get github.com/boltdb/bolt/…

程序执行:

$ blockchain_go printchain

No existing blockchain found. Creating a new one…

Mining the block containing “Genesis Block”

000000edc4a82659cebf087adee1ea353bd57fcd59927662cd5ff1c4f618109b

Prev. hash:

Data: Genesis Block

Hash:000000edc4a82659cebf087adee1ea353bd57fcd59927662cd5ff1c4f618109b

PoW: true

$ blockchain_go addblock -data “Send 1 BTC to Ivan”

Mining the block containing “Send 1 BTC to Ivan”

000000d7b0c76e1001cdc1fc866b95a481d23f3027d86901eaeb77ae6d002b13

Success!

$ blockchain_go addblock -data “Pay 0.31337 BTC for a coffee”

Mining the block containing “Pay 0.31337 BTC for a coffee”

000000aa0748da7367dec6b9de5027f4fae0963df89ff39d8f20fd7299307148

Success!

$ blockchain_go printchain

Prev.hash:000000d7b0c76e1001cdc1fc866b95a481d23f3027d86901eaeb77ae6d002b13

Data: Pay 0.31337 BTC for a coffee

Hash:000000aa0748da7367dec6b9de5027f4fae0963df89ff39d8f20fd7299307148

PoW: true

Prev.hash:000000edc4a82659cebf087adee1ea353bd57fcd59927662cd5ff1c4f618109b

Data: Send 1 BTC to Ivan

Hash:000000d7b0c76e1001cdc1fc866b95a481d23f3027d86901eaeb77ae6d002b13

PoW: true

Prev. hash:

Data: Genesis Block

Hash:000000edc4a82659cebf087adee1ea353bd57fcd59927662cd5ff1c4f618109b

PoW: true

此章汇总

此章大家完成了区块的分布式锁,也有健全了解析xml信息内容来适用按顺序打印出全部的区块。下一章大家可能完成 address,wallet,transaction。敬请关注!

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。