兄弟连区块链培训教程分享CLI命令行接口
直到如今,大家的完成都还没给予一切实际操作插口给外部应用。大家此前的事例中在 main 函数公式中实行新创建区块链 NewBlockchain,也有新增加区块 bc.AddBlock 的方式。现在可以改进,提升命令行实际操作插口了。大家必须如下所示这种的命令:
$ 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。