Un proceso de aplicación de fabric-sdk-go, una implementación de fabric-sdk-go basada en la ruta tecnológica de Tongji

En uno de mis artículos, presenté el proceso de prueba de implementación de la versión secreta nacional de Hyperledger Fabric v1.4.1, pero ese artículo usó la CLI al probar el Fabric. Sabemos que la transformación del secreto nacional de un Fabric Hyperledger completo incluye las tres partes de la transformación del secreto nacional del código fuente de Fabric, Fabric SDK y Fabric CA. Entre ellos, la urgencia de los requisitos de Fabric CA no es muy alta, pero los requisitos de la transformación del secreto nacional de Fabric SDK son reales. Sin él, no hay forma de escribir programas para interactuar con Fabric. Por lo tanto, este artículo toma una versión de código abierto de fabric-sdk-go-gm en Internet como ejemplo, y toma la versión de Fabric v1.4.1 (v1.4.6 también funciona) de la transformación del secreto nacional como la cadena de alianza subyacente, y presenta brevemente el secreto nacional fabric-sdk-go. El proceso de uso.

1. Preparación

1. Consulte mi artículo Fabric Hyperledger 1.4.1 Versión de modificación del secreto nacional Centos Proceso de implementación y prueba independiente Implemente una versión secreta nacional de Fabric en esta máquina. Una vez completada la implementación, ingrese al first-networkdirectorio e ./byfn.sh upinicie una red de prueba. Aunque ese artículo habla sobre el funcionamiento en el entorno Centos, también es posible en Mac OS y Windows.
2. Descargue bolenzhang como código abierto go-sdk. No hay ningún requisito para el directorio descargado. Puede colocarse en el $GOPATH/src/github.com/hyperledgerdirectorio y juntarse con Fabric.

cd $GOPATH/src/github.com/hyperledger/
git clone [email protected]:bolenzhang/fabric-go-sdk-gm.git

3. Ejecute para go envcomprobar GO111MODULEsi la variable de entorno es auto. No es necesario cambiarlo y hacer que surta efecto (en Windows, verifique si surte efecto varias veces, es posible que deba cerrar la sesión o reiniciar)

2. Cree un nuevo proyecto de aplicación

Usamos la versión secreta nacional de go-sdk, que no se puede usar directamente go modpara administrar dependencias. Todas las dependencias deben colocarse en el directorio de proveedores, pero podemos usarlo primero go modpara descargar la biblioteca dependiente.

cd $GOPATH/src
mkdir sdk_test
cd sdk_test
go mod init sdktest

Tres, crea un archivo de configuración

Cite directamente el archivo de configuración del SDK de muestra config.yaml que se proporciona en este artículo utilizando el código de la cadena de operación fabric-sdk-go y guárdelo como sdk_test/config.yaml, pero hay los siguientes puntos a tener en cuenta:

3.1 、 BCCSP

Al aplicar el secreto nacional go-sdk, este elemento debe comentarse.

  # [Optional] BCCSP config for the client. Used by GO SDK.
  # BCCSP:
  #   security:
  #     enabled: true
  #     default:
  #       provider: "GM"
  #     hashAlgorithm: "GMSM3"
  #     softVerify: true
  #     level: 256

Debido a que el SDK convertirá automáticamente el algoritmo, no es necesario configurarlo en GM. Por supuesto, SWno hay problema si lo configura como el archivo de configuración original . Aquí usamos la configuración predeterminada por defecto.

3.2 、 tlsCerts

  tlsCerts:
    # [Optional]. Use system certificate pool when connecting to peers, orderers (for negotiating TLS) Default: false
    systemCertPool: true

Si está utilizando un sistema operativo Windows, cámbielo aquí a falso. Tenga en cuenta que hay un espacio entre los dos puntos y "verdadero". Si eres un sistema como Centos o Ubuntu, no necesitas cambiarlo; si eres un sistema operativo Mac, habrá algunos problemas si no lo cambias aquí, pero podemos modificar sm2el código fuente para solucionarlo. Hablaré de esto más tarde cuando lo uses.

3.3, todos los caminos

Todo lo relacionado con la ruta en el archivo de configuración /Users/shitaibin/go/src/github.com/hyperledger/fabric/fabric-samplesdebe reemplazarse con su ruta real local.Tenga en cuenta que no existe en Windows /, se estima que debe usarse \\(esto no es seguro).

Cuarto, escribe archivos de prueba

Este artículo utiliza un main.goarchivo de prueba simple como archivo de prueba. El método de escritura del archivo de prueba también se refiere al artículo "Uso de fabric-sdk-go para operar el código de cadena" mencionado anteriormente. Utilice su editor o vimcree uno en el directorio raíz del proyecto con el main.gosiguiente contenido:

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
	"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
	"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
)

const (
	org1CfgPath = "./config.yaml"
	ChannelID   = "mychannel"

	peer0Org1 = "peer0.org1.example.com"
	peer0Org2 = "peer0.org2.example.com"
)

func main() {
    
    
	sdk, err := fabsdk.New(config.FromFile(org1CfgPath))
	if err != nil {
    
    
		log.Panicf("failed to create fabric sdk: %s", err)
	}

	ccp := sdk.ChannelContext(ChannelID, fabsdk.WithUser("User1"))
	cc, err := channel.New(ccp)
	if err != nil {
    
    
		log.Panicf("failed to create channel client: %s", err)
	}

	query(cc)
	execute(cc)
	time.Sleep(5 * time.Second)
	query(cc)
}

func query(cc *channel.Client) {
    
    
	// new channel request for query
	req := channel.Request{
    
    
		ChaincodeID: "mycc",
		Fcn:         "query",
		Args:        packArgs([]string{
    
    "a"}),
	}
	// send request and handle response
	reqPeers := channel.WithTargetEndpoints(peer0Org1)

	response, err := cc.Query(req, reqPeers)
	if err != nil {
    
    
		fmt.Printf("failed to query chaincode: %s\n", err)
	}

	if len(response.Payload) > 0 {
    
    
		fmt.Printf("chaincode query success,the value is %s\n", string(response.Payload))
	}
}

func execute(cc *channel.Client) {
    
    
	args := packArgs([]string{
    
    "a", "b", "10"})
	req := channel.Request{
    
    
		ChaincodeID: "mycc",
		Fcn:         "invoke",
		Args:        args,
	}
	peers := []string{
    
    peer0Org1, peer0Org2}
	reqPeers := channel.WithTargetEndpoints(peers...)
	response, err := cc.Execute(req, reqPeers)
	if err != nil {
    
    
		fmt.Printf("failed to Execute chaincode: %s\n", err)
	}
	fmt.Printf("Execute chaincode success,txId:%s\n", response.TransactionID)
}

func packArgs(paras []string) [][]byte {
    
    
	var args [][]byte
	for _, k := range paras {
    
    
		args = append(args, []byte(k))
	}
	return args
}

El archivo de prueba es muy simple, primero inicialice el SDK y establezca un canal, luego consulte el contrato, ejecute la transacción y luego consulte el contrato para ver si el valor está actualizado.

Cinco, dependencias de instalación

Aquí viene el punto: hay muchas operaciones aquí. Suponemos que sdk_testestá operando en el directorio raíz del proyecto , y el SDK de la versión secreta nacional también se coloca en el $GOPATH/src/github.com/hyperledger/directorio como se recomienda :

go run main.go

La dependencia se instalará primero y luego se informará un error al analizar el certificado x509. Ignórelo y el resultado es normal.
Luego ejecuta:

go mod vendor

Copie todas las dependencias en el directorio de proveedores del proyecto.
Luego ejecuta:

rm go.mod
rm go.sum
rm -rf vendor/github.com/hyperledger/fabric-sdk-go
cp -r $GOPATH/src/github.com/hyperledger/fabric-go-sdk-gm vendor/github.com/hyperledger/fabric-sdk-go

El significado del comando anterior es eliminar go model contenido relevante y usar el SDK secreto nacional para reemplazar el SDK nativo.

Seis, ejecuta la prueba

Ejecutémoslo de nuevo go run main.go. Si se le indica que faltan algunas bibliotecas, puede abrir una nueva terminal y descargarla consultando el siguiente comando:

mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/crypto.git

Una vez finalizada la descarga, ejecuta el programa en el terminal original. Aquí, habrá diferentes resultados según los diferentes sistemas operativos:

1. Centos o Ubuntu

La operación es exitosa En el registro de salida, podemos ver que el valor de a en el código de cadena es correcto.

2 、 ventanas

Se informará un error cuando se ejecute en el entorno de Windows (tenga en cuenta que systemCertPool en el archivo de configuración en Windows debe ser falso):

# chaincodedemo/vendor/github.com/google/certificate-transparency-go/x509
vendor\github.com\google\certificate-transparency-go\x509\root_windows.go:112:3: cannot use uintptr(unsafe.Pointer(sslPara)) (type uintptr) as type syscall.Pointer in field value

Esto se debe a que una biblioteca es demasiado antigua y debemos actualizarla manualmente.

git clone [email protected]:google/certificate-transparency-go.git

Copie la biblioteca descargada al directorio correspondiente al proveedor para reemplazarla. Ejecútelo de nuevo go run main.goy tendrá éxito.

3 、 Mac OS

Debido a que la Mac debajo del archivo de configuración systemCertPoolestá trueen la versión cercana del país, encontrará los archivos que no corresponden e inicializados nil, por lo tanto, error. Después de la prueba, la tela original con la tela-sdk-go original no tendrá este problema. Este problema se debe a que en el sm2/cert_pool.goarchivo no se enumeran las posibles ubicaciones de archivo en Mac OS. Según el mensaje de error, lo abrimos vendor/github.com/fabric-sdk-go/internal/github.com/tjfoc/gmsm/sm2/cert_pool.go(se recomienda vscode) y puedes ver que hay dos definiciones:

// Possible certificate files; stop after finding one.
var certFiles = []string{
    
    
	"/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
	"/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
	"/etc/ssl/ca-bundle.pem",                            // OpenSUSE
	"/etc/pki/tls/cacert.pem",                           // OpenELEC
	"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
}

// Possible directories with certificate files; stop after successfully
// reading at least one file from a directory.
var certDirectories = []string{
    
    
	"/etc/ssl/certs",               // SLES10/SLES11, https://golang.org/issue/12139
	"/system/etc/security/cacerts", // Android
}

El programa inicializa el grupo de certificados del sistema en el archivo o la ruta enumerados anteriormente.

Aunque hay un "/etc/ssl/certs"directorio en Mac OS , está vacío. Por lo tanto, después de buscarlo en Google, se certFilesdebe agregar una definición en Mac OS "/usr/local/etc/openssl/cert.pem", // Macpara cambiar a:

// Possible certificate files; stop after finding one.
var certFiles = []string{
    
    
	"/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
	"/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
	"/etc/ssl/ca-bundle.pem",                            // OpenSUSE
	"/etc/pki/tls/cacert.pem",                           // OpenELEC
	"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
	"/usr/local/etc/openssl/cert.pem",                   // Mac
}

Guarde y salga, y luego vuelva a ejecutar go run main.go, el valor de a se generará correctamente.

Siete, resumen

Bueno, desde la perspectiva de este artículo, es bastante simple probar el tejido secreto nacional-sdk-go con el tejido secreto nacional (principalmente la aplicación go-sdk, el sdk secreto nacional ha sido escrito por otros). Muchas gracias por el bolenzhanglanzamiento del almacén secreto nacional fabric-go-sdk-gm. Los lectores que lo utilicen pueden githubdarle una orden star.

Hasta ahora, la transformación secreta de estado de Fabric Hyperledger basada en la versión de código abierto en línea de la aplicación es actualmente solo una Fabric CA. Después de que esta CA, etc., encuentre una versión secreta nacional de código abierto adecuada, escribiré un artículo para presentar su uso.

Para probar la CA, mi entorno local se ha cambiado al Fabric original. Por lo tanto, la mayor parte del contenido de este artículo se escribe desde la memoria y no hay ningún paso de control real. Si hay omisiones o errores en el medio, deje un mensaje para corregirlo o discutirlo.

Supongo que te gusta

Origin blog.csdn.net/weixin_39430411/article/details/108171042
Recomendado
Clasificación