Registro de prácticas de desarrollo de códigos de cadena de Hyperledger Fabric

1. Descripción general de la estructura del código de la cadena

Aquí, el desarrollo del código en cadena utiliza el lenguaje Go. Por este motivo, es necesario aprender brevemente el lenguaje Go. Este es un lenguaje ligero. Lo interesante es que tiene sus propios canales y puede ser concurrente, lo cual es muy adecuado para sistemas distribuidos a gran escala. Desarrollo.
Para iniciar el código en cadena, se debe llamar a la función Start en el paquete shim. El parámetro de esta función es un tipo de interfaz Chaincode. Hay dos métodos en el tipo de interfaz Chaincode, Init e Invoke. Estos son dos métodos extremadamente importantes en el desarrollo de código en cadena:

  • Init: se llama cuando se crea una instancia del código de cadena o se actualiza para completar la inicialización de datos;
  • Invocar: se llama al actualizar o consultar el estado de los datos del libro mayor en una transacción de propuesta.

En el desarrollo real, es necesario definir una estructura y reescribir los métodos Init e Invoke para completar funciones relacionadas. Echemos un vistazo a la estructura necesaria de un código en cadena:

package main //所写的包的名称

import (
        "fmt"
        "github.com/hyperledger/fabric/core/chaincode/shim"
        "github.com/hyperledger/fabric/protos/peer"
)//引入必要的包

type HelloChaincode struct{
    
    }//定义一个结构体

func main() {
    
    
        err := shim.Start(new(HelloChaincode))
        if err != nil {
    
    
                fmt.Printf("链码启动失败: %v", err)
        }
}//主函数,调用shim.Start方发启动链码

func (t *HelloChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{
    
    
       
}

func (t *HelloChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{
    
            fun, args := stub.GetFunctionAndParameters()
       
}

2. Familiarizado con la API relacionada con el código de cadena

Principalmente la API proporcionada por el paquete shim, dividida en 5 categorías:

  1. API de análisis de parámetros: se utiliza para obtener parámetros
  2. API de operación del estado de los datos del libro mayor: consultar y actualizar los datos de la cuenta, etc.
  3. API de adquisición de información de transacciones: obtenga la información de transacción enviada
  4. API de procesamiento de eventos: relacionada con el procesamiento de eventos
  5. API para manipulación de datos privados: específicamente para manipulación de datos privados

El número de API sigue siendo relativamente grande, la mayoría de las cuales son para obtener información relevante. Si tienes tiempo, puedes echar un vistazo más de cerca. Las principales utilizadas en la etapa inicial:

  • GetFunctionAndParameters () (cadena de función, cadena params []) devuelve el nombre de la función llamada y la lista de parámetros
  • GetStringArgs () [] string devuelve la lista de parámetros directamente
  • GetState (cadena de clave) ([] byte, error) Consulta el estado de los datos de acuerdo con el valor de clave especificado
  • PutState (cadena de clave, valor [] byte) error De acuerdo con la clave especificada, guarde el valor correspondiente en el libro mayor

3. Chaincode implementa Hello World

3.1 Desarrollo de chaincode

Primero escribe un hola mundo para practicar las manos.

  1. Vaya al directorio del código de cadena y cree una carpeta llamada hello, luego cree y edite el archivo de código de cadena:
sudo mkdir hello && cd hello
sudo vim hello.go
  1. Importe el paquete de dependencia del código de cadena:
package main

import (
			"fmt"
			"github.com/hyperledger/fabric/core/chaincode/shim"
			"github.com/hyperledger/fabric/protos/peer"
		)
  1. Escribe la función principal:
func main() {
    
    
			err := shim.Start(new(HelloChaincode))
			if err != nil {
    
    
				fmt.Printf("链码启动失败: %v", err)
			}
}
  1. Estructura personalizada:
type HelloChaincode struct{
    
    }
  1. Reescribe el método Init. Su función es inicializar el estado de los datos. Un paso lógico simple es el siguiente:
  • Obtener parámetros y determinar si los parámetros son legales;
  • Llame a la función PutState para escribir el estado en el libro mayor;
  • Si hay un error de escritura;
  • Finalmente, llame a la función Success para devolver un estado de éxito.
func (t *HelloChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{
    
    
		    fmt.Println("开始实例化链码")
			_, args := stub.GetFunctionAndParameters()
			if len(args) != 2 {
    
    
				return shim.Error("指定了错误的参数个数")
			}
			fmt.Println("保存数据")
			err := stub.PutState(args[0],[]byte(args[1]))
			if err !=nil{
    
    
				return shim.Error("保存数据时发生错误")
			}
			fmt.Println("实例化成功")
			return shim.Success(nil)
}

Puede prestar atención a la función GetFunctionAndParameters (), donde la forma del parámetro es: "Args": ["init", "Hello", "Wzh"], la función obtiene la función llamada "init" y el parámetro pasado "Hello" "," Wzh ", así escrito en forma de _, args, también se puede reemplazar con la función GetStringArgs () para obtener directamente los siguientes parámetros.

  1. Reescribe el método Invoke, su lógica simple es:
  • Obtener parámetros y determinar si los parámetros son legales;
  • Utilice el valor clave para obtener el estado;
  • Complete la función de la función llamada;
  • Devuelve el estado de los datos o el estado de éxito.
func (t *HelloChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{
    
    	fun, args := stub.GetFunctionAndParameters()
			if fun == "query"{
    
    
				return query(stub,args)
			}
			return shim.Error("非法操作,指定功能不能实现")
}

func query(stub shim.ChaincodeStubInterface,args  []string) peer.Response{
    
    
			if len(args) !=1{
    
    
				return shim.Error("指定的参数错误,必须且只能指定相应的Key")
			}
			result,err :=stub.GetState(args[0])
			if err !=nil {
    
    
				return shim.Error("根据指定的" +args[0] +"查询数据时发生错误")
			}
			if result ==nil {
    
    
				return shim.Error("根据指定的" +args[0] +"没有查询到相应的数据")
			}
			return shim.Success(result)
}

Este código es muy simple y claro, así que no lo repetiré.

3.2 Prueba de encadenamiento

Es el enlace de la prueba del código en cadena nuevamente. El proceso específico se encuentra en el registro anterior. A continuación, solo se adjunta el código:

cd chaincode-docker-devmode
sudo docker-compose -f docker-compose-simple.yaml up -d

Abra la ventana de la terminal 2:

sudo docker exec -it chaincode bash
cd hello
go build
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=hellocc:0 ./hello

Abra la ventana de la terminal 3:

sudo docker exec -it cli bash、
peer chaincode install -p chaincodedev/chaincode/hello -n hellocc -v 0
peer chaincode instantiate -n hellocc -v 0 -c '{"Args":["init","Hello","Wzh"]}' -C myc
peer chaincode query -n hellocc  -c '{"Args":["query","Hello"]}' -C myc

La consulta final debería poder obtener Wzh (es decir, el contenido de la asignación de la tecla Hello)

Supongo que te gusta

Origin blog.csdn.net/weixin_43107949/article/details/109350623
Recomendado
Clasificación