当前位置:首页 > 知识 >

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

直到如今,我们的代码还没有为外部应用提供任何实际操作接口。在之前的例子中,我们在main函数中使用NewBlockchain创建新的区块链,并使用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和printchain,并使用“-data”标识我们的代码看起来很像我们之前写的代码。不同之处在于,我们现在使用BlockchainIterator来解析整个区块链中的所有区块。

最后修改main函数:

func main() { bc := NewBlockchain() defer bc.db.Close() cli := CLI{bc} cli.Run() }

请注意,第一次运行时,如果BoltDB中没有区块链,则无论键入什么参数,都会创建一个新的区块链。

现在,我们可以测试一下我们的代码是否工作正常:

首先安装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

本章小结:

本章中,我们完成了区块的分布式锁定,以及根据顺序解析所有区块的相关信息。下一章中,我们将可能完成地址、钱包和交易等内容。敬请期待!

猜你喜欢

微信二维码

微信