Módulo de operación de línea de comando de desarrollo de cadena de bloques


Enlace: Dirección de github del proyecto Blockchain
Progreso actual del proyecto:
inserte la descripción de la imagen aquí

Características

En comparación con la interfaz gráfica de usuario, usar la línea de comando para operar la cadena de bloques es más fácil de escribir código y también puede implementar funciones complejas. Las funciones del módulo de línea de comandos deben cumplir los siguientes requisitos:
1. Entrada sin ningún parámetro: información de la función de soporte de la línea de comandos de salida
inserte la descripción de la imagen aquí

2. Parámetro de entrada addBlock -data "Alice envía 100 eth a Bob" : Salida
inserte la descripción de la imagen aquí3. Parámetro de entrada crear:
El bloque de Génesis no existe: Salida de información del bloque de Génesis
inserte la descripción de la imagen aquíEl bloque de Génesis existe: Indicación de salida
inserte la descripción de la imagen aquí4. Parámetro de entrada printChain
inserte la descripción de la imagen aquí

Introducción al uso de banderas en el lenguaje go

El lenguaje go obtiene parámetros de línea de comandos y operaciones de línea de comandos a través de indicadores, y los pasos se pueden clasificar en los siguientes pasos:
1. Para crear un nuevo conjunto de indicadores, debe pasar parámetros con nombre

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

2. La configuración del valor predeterminado del parámetro
"datos" indica el nombre del parámetro, "Alice envía 100 eth a Bob" indica el valor predeterminado y "agregar datos al bloque" indica la información de solicitud del parámetro.

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

3. Determine el tipo de comando y active el indicador de destino.
os.args[1] indica los parámetros del comando, y os.args[0] es el nombre del archivo que se ejecutará, por lo que debe juzgarse a partir de la subíndice 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. Determine qué banderas están activadas y ejecute la función de destino
addBlockcmd.Parsed() para determinar si la bandera está analizada, addBlockcmd es el tipo de conjunto de banderas

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

Implementación específica de la línea de comando del proyecto.

1. Encapsule la clase de línea de comando para reducir el acoplamiento entre módulos.

type CLI struct {
    
    
	BC *BlockChain
}

2. Cree un nuevo indicador de línea de comando y use la línea de comando para solicitar si no conoce el uso de la línea de comando

// 命令行提示用法展示
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. Complete la escritura de funciones de las tres funciones anteriores

// 初始化区块链
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. Cree una función de interfaz de operación de línea de comando run (), que es conveniente para ejecutar en la función principal. La idea específica de run() es la siguiente:

  1. Crear conjunto de banderas
  2. Establezca los parámetros de flagSet con parámetros a valores predeterminados
  3. Determine la cadena de la línea de comando y analice el indicador correspondiente
  4. Para el indicador analizado con éxito, busque la función correspondiente y ejecútela

En comparación con la introducción al uso de banderas , aquí hay una nueva función de evaluación de archivos y una función de evaluación de caracteres de línea de comando cuando se crea el bloque génesis, de la siguiente manera:

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

os.Stat es una función para obtener información de archivos encapsulada por el lenguaje go. Si el archivo existe, se puede devolver información diversa sobre el archivo y, si el archivo no existe, se devolverá un error. Puede usar el error devuelto para detectar y determinar si el archivo existe.

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

Supongo que te gusta

Origin blog.csdn.net/qq_45931661/article/details/128546327
Recomendado
Clasificación