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-network
directorio e ./byfn.sh up
inicie 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/hyperledger
directorio y juntarse con Fabric.
cd $GOPATH/src/github.com/hyperledger/
git clone [email protected]:bolenzhang/fabric-go-sdk-gm.git
3. Ejecute para go env
comprobar GO111MODULE
si 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 mod
para administrar dependencias. Todas las dependencias deben colocarse en el directorio de proveedores, pero podemos usarlo primero go mod
para 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, SW
no 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 sm2
el 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-samples
debe 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.go
archivo 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 vim
cree uno en el directorio raíz del proyecto con el main.go
siguiente 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_test
está 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 mod
el 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.go
y tendrá éxito.
3 、 Mac OS
Debido a que la Mac debajo del archivo de configuración systemCertPool
está true
en 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.go
archivo 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 certFiles
debe agregar una definición en Mac OS "/usr/local/etc/openssl/cert.pem", // Mac
para 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 bolenzhang
lanzamiento del almacén secreto nacional fabric-go-sdk-gm. Los lectores que lo utilicen pueden github
darle 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.