区块链之开发命令行操作模块

news2024/9/28 5:32:27

文章目录

    • 功能介绍
    • go语言中flag用法简介
    • 项目命令行具体实现

链接: 区块链项目github地址
项目目前进度:
在这里插入图片描述

功能介绍

利用命令行操作区块链相较于图形用户界面来说,编写代码简单,同时也可以实现复杂的功能。命令行模块的功能应该满足:
1.无任何参数输入:输出命令行支持功能信息
在这里插入图片描述

2.输入参数addBlock -data “Alice send 100 eth to Bob”:输出
在这里插入图片描述3.输入参数create:
创世区块未存在:输出创世区块信息
在这里插入图片描述创世区块已存在:输出提示
在这里插入图片描述4.输入参数printChain
在这里插入图片描述

go语言中flag用法简介

go语言通过flag获取命令行参数与命令行操作,其中步骤可以归为一下几步:
1.新建flagSet,需要传入命名参数

addBlockcmd := flag.NewFlagSet("addBlock", flag.ExitOnError)

2.参数默认值设置
"data"表示参数名称,"Alice send 100 eth to Bob"表示默认值,"add data to block"表示参数提示信息。

flagAddBlockArg := addBlockcmd.String("data", "Alice send 100 eth to Bob", "add data to block")

3.判断命令类型,并进行目标flag进行激活
os.args[1]表示命令的参数,os.args[0]为执行的文件名称,所以需要从下标为1开始判断。

switch os.Args[1] {
	case "addBlock":
		err := addBlockcmd.Parse(os.Args[2:])
		if err != nil {
			log.Panicf("parse the addBlockcmd failed%v\n", err)
		}
	}

4.判断被激活的flag有哪些,并执行目标函数
addBlockcmd.Parsed()判断flag是否被解析,addBlockcmd为flagset类型

	if addBlockcmd.Parsed() {
		if *flagAddBlockArg == "" {
			//未输入-data的参数
			PrintUsage()
			os.Exit(1)
		}
		cli.addBlock(*flagAddBlockArg)
	}

项目命令行具体实现

1.封装命令行类,降低各个模块之间的耦合性。

type CLI struct {
	BC *BlockChain
}

2.新建命令行提示符,在不清楚命令行用法的情况下,使用命令行进行提示

// 命令行提示用法展示
func PrintUsage() {
	fmt.Println("Usage:  go run file.exe <command> [arguments]")
	//初始化区块链
	fmt.Printf("\tcreate              create a new blockchain\n")
	//添加区块
	fmt.Printf("\taddBlock   -data  	 add a new block\n")
	//遍历区块链
	fmt.Printf("\tprintChain          print the all message of blockchain\n")
}

3.完成以上三个功能的函数编写

// 初始化区块链
func (cli *CLI) createBlockchain() {
	CreateBlockChainWithGenesisBlock()
}

// 添加区块
func (cli *CLI) addBlock(data string) {
	if !DBExist() {
		fmt.Printf("DB haven't existed")
		os.Exit(1)
	}
	block := BlockChainObject()
	block.AddBlock([]byte(data))
}

// 打印区块完整信息
func (cli *CLI) printChain() {
	if !DBExist() {
		fmt.Printf("DB haven't existed")
		os.Exit(1)
	}
	block := BlockChainObject()
	block.PrintBlockChain()
}

4.创建命令行运行接口函数run(),便于在主函数中运行。其中run()的具体思路如下:

  1. 建立flagSet
  2. 将有参数的flagSet的参数进行默认值设置
  3. 判断命令行字符串,并对相应的flag进行解析
  4. 对解析成功的flag,找到对应的函数并运行

这里相较于flag用法简介,新增了一个创世区块创建时的文件判断函数与命令行字符判断函数,如下:

// 参数数量检测函数
func IsValidArgs() {
//未输入任何功能需求
	if len(os.Args) < 2 {
		PrintUsage()
		os.Exit(1)
	}
}

os.Stat为go语言封装的一个获取文件信息的函数。若文件存在,则可以返回文件的各种信息,若文件不存在,则返回错误。可以利用返回的错误进行检测,判断文件是否存在。

// 判断数据库文件是否存在
func DBExist() bool {
	if _, err := os.Stat(dbName); os.IsNotExist(err) {
		//数据库文件不存在
		return false
	}
	return true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习笔记 --- JDBC(1)

一、JDBC概述 基本介绍 1、JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题 2、Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作 3、JDBC原理图 JDBC带来的好处 JDBC是Java提供一套用于数…

安卓移动端调用自然语言处理nlp模型【示例+源码】

安卓可以使用许多不同的方法来调用NLP模型。其中一种方法是使用现有的自然语言处理库,例如 Apache OpenNLP、 Stanford NLP 和 NLTK。这些库提供了许多常用的 NLP 功能,如分词、词干化、命名实体识别和词性标注。另一种方法是使用 TensorFlow Lite 或其他机器学习框架来加载并…

[ins 2022] 针对已见和未见群体的群体推荐中的贝叶斯归纳学习

Bayesian inductive learning in group recommendations for seen and unseen groupshttps://www.sciencedirect.com/science/article/pii/S0020025522008933摘要群组推荐是指向一组用户&#xff08;即成员&#xff09;推荐物品。在预测相关项目时&#xff0c;模型通常会面临未…

fs 文件系统模块

1、什么是 fs 文件系统模块 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 方法名 说明 fs.readFile() 用来读取指定文件中的内容 fs.writeFile() 用来向指定的文件中写入内容 如果要在 J…

webflux整合swagger教程V2版

1. yml文件配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.1.0.RELEASE</version></dependency><!--数据库开始--&…

python @classmethod

1..什么是classmethod classmethod是用来指定一个类的方法为类方法 长的像下面这个样子 1 2 3 class cc: classmethod def f(cls, arg1, arg2, ...): ... cls通常用作类方法的第一参数 跟self有点类似&#xff08; __init__里面的slef通常用作实例方法的第一参数)。…

vue开发环境配置Visual Studio Code配置和安装教程

方便前端vue开发&#xff0c;使用vs code插件安装详细教程&#xff0c;关于vs code可以网络上相关的教程&#xff0c;插件安装如下图所示&#xff0c;大家常用的插件可再分享&#xff0c;与我联系。 1 安装Vue语法高亮显示插件&#xff1a;vetur 2 安装vue语法提示插件&#xf…

小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我

评语 班主任评语&#xff1a; 你是一个性格内向、聪明伶俐的男孩。平时能按时完成老师布置的作业&#xff0c;学习认真&#xff0c;成绩优良&#xff0c;做事认真。但有时自己的事情还不能自己完成&#xff0c;希望你以后可以独立起来&#xff0c;遇到问题多想办法&…

高性能网关基石——OpenResty

什么是 OpenRestyOpenResty 一个基于 Nginx 的高性能 Web 平台&#xff0c;能够方便地搭建处理超高并发的动态 Web 应用、 Web 服务和动态网关。例如有名的 Kong 网关和国产新秀 ApiSIX 网关都是基于 OpenResty 来进行打造的。OpenResty 通过实现 ngx_lua 和 stream_lua 等 Ngi…

Nmap工具使用

Nmap工具使用1.Nmap简介1.1.Nmap介绍1.2.Nmap功能介绍1.3.Nmap下载1.4.Nmap端口状态2.Nmap基本使用2.1.Nmap基础扫描2.2.Nmap基础扫描多个目标2.3.Nmap详细扫描输出2.4.Nmap指定端口扫描2.4.1.单端口扫描2.4.2.端口范围扫描2.4.3.端口组合扫描2.5.Nmap扫描排除2.5.1.排除一个主…

强大的ANTLR4(6)--设计语法

四种抽象的计算机语言模式&#xff1a; 1&#xff09;序列&#xff1a;一列元素&#xff0c;数组 2&#xff09;选择&#xff1a;在多个可选方案中做出选择 3&#xff09;词法符号依赖&#xff1a;例如左右括号匹配 4&#xff09;嵌套结构&#xff1a;一种自相似的语言结构。 …

lambda表达式入门

一、函数式编程思想 1 概念 面向对象思想需要关注用什么对象完成什么时期&#xff0c;而函数式编程思想更类似于我们数学中的函数&#xff0c;它主要关注的是对数据进行了什么操作 2 优点 代码简洁&#xff0c;开发快速接近自然语言&#xff0c;易于理解易于"并发编程…

计算机网络——BGP协议

BGP协议 和谁交换&#xff1a;与其他AS的邻站BGP发言人交换信息。 交换什么&#xff1a;交换网络可达性信息 多久交换一次&#xff1a;发生变化时更新有变化的部分 一般来说两个网络都是由一个BGP发言人连接的。 BGP协议交换信息的过程 BGP协议所交换的网络可达性的信息就…

Haproxy 代理后端服务

参考 http://www.haproxy.org HAProxy GitHub 目录 一、Haproxy环境准备 1、Haproxy简介 1.1、haproxy原理 1.2、Haproxy优点 2、在线apt安装 二、使用Haproxy 1、基本脚本结构示例 2、配置反向代理 3、验证haproxy 3.1、重启服务 3.2、访问后台管理 3.3、访问…

Linux下用gdb定位Qt程序崩溃位置(systemd-coredump)

目录1. systemd-coredump2. 用gdb定位崩溃位置Linux提供了systemd-coredump服务&#xff0c;可以配合gdb来定位到程序崩溃位置&#xff0c;下面介绍它们的用法。1. systemd-coredump systemd-coredump的简单介绍&#xff1a; systemd-coredump能从操作系统内核中获取内存转储&…

IDEA2022.1创建Maven web项目 + SpringMVC入门学习

SpingMVC 入门案例 文章目录SpingMVC 入门案例项目的结构1.导入SpringMVC和Servlet依赖2.创建SpringMVC控制器类&#xff08;等同Servlet&#xff09;3.初始化SpingMVC环境&#xff08;同Spring环境&#xff09;&#xff0c;设定SpringMVC加载对应的bean4.创建web容器启动类&am…

MWORKS.Sysplorer基于数据字典管理模型参数应用案例

1 引言 在面向微控制器的建模过程中&#xff0c;控制算法是可以复用到不同型号的同类产品中的。为了提高控制算法的可移植性&#xff0c;需要将模型与数据分开管理。如果不将模型与数据分开管理&#xff0c;直接将数据保存到模型中&#xff0c;即使在非批产的工程化应用或者小…

11.前端笔记-Bootstrap前端框架

1.Bootstrap简介 框架&#xff1a; 就是一台架构&#xff0c;有较为完整的网页功能解决方案&#xff0c;而且控制权在框架本身&#xff0c;有预制样式库、组件和插件。使用者要按照框架规定的规范进行开发 参考&#xff1a; 中文官网&#xff1a;http://www.bootcss.com 官…

Spring中实用的11个扩展点

我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。 除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让…

【Vue2+Element ui通用后台】面包屑和tag功能

文章目录面包屑tag面包屑 Element ui 面包屑&#xff1a;显示当前页面的路径&#xff0c;快速返回之前的任意页面&#xff0c;完成效果如下&#xff1a; 我们之前把头部的代码封装到了 CommonHeader.vue 中&#xff0c;面包屑部分直接写死了一个首页&#xff0c;我们可以把官…