Um processo de aplicação de fabric-sdk-go, uma implementação fabric-sdk-go baseada na rota de tecnologia de Tongji

Em um de meus artigos, apresentei o processo de teste de implantação da versão secreta nacional do Hyperledger Fabric v1.4.1, mas esse artigo usou a CLI ao testar o Fabric. Sabemos que a transformação do segredo nacional de um Fabric Hyperledger completo inclui as três partes da transformação do segredo nacional do código-fonte do Fabric, Fabric SDK e Fabric CA. Entre eles, a urgência da demanda pelo Fabric CA não é muito grande, mas a demanda pela transformação do segredo nacional do Fabric SDK é real, sem ela não há como escrever programas para interagir com o Fabric. Portanto, este artigo usa uma versão de código-fonte aberto fabric-sdk-go-gm na Internet como exemplo e usa Fabric v1.4.1 (v1.4.6 também está OK) como a cadeia de aliança subjacente e apresenta brevemente o segredo nacional fabric-sdk-go O processo de uso.

1. Preparação

1. Consulte meu artigo Fabric Hyperledger 1.4.1 National Secret Modification Version Centos Implementação autônoma e processo de teste Implemente uma versão nacional secreta do Fabric nesta máquina. Após a conclusão da implantação, entre no first-networkdiretório e ./byfn.sh upinicie uma rede de teste. Embora esse artigo fale sobre a operação no ambiente Centos, também é possível em Mac OS e Windows.
2. Baixe bolenzhang como um código aberto go-sdk. Não há nenhum requisito para o diretório baixado. Ele pode ser colocado no $GOPATH/src/github.com/hyperledgerdiretório e colocado junto com o Fabric.

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

3. Execute para go envverificar GO111MODULEse a variável de ambiente é auto. Não é necessário alterá-lo e torná-lo efetivo (no Windows, verifique se ele entra em vigor várias vezes, pode ser necessário sair ou reiniciar)

2. Crie um novo projeto de aplicativo

Usamos a versão nacional secreta do go-sdk, que não pode ser usada diretamente go modpara gerenciar dependências. Todas as dependências precisam ser colocadas no diretório do fornecedor, mas podemos usá-lo primeiro go modpara baixar a biblioteca dependente.

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

Três, crie um arquivo de configuração

Cite diretamente o exemplo de arquivo de configuração do SDK, config.yaml, fornecido no artigo Usando o código da cadeia de operação fabric-sdk-go , salve-o como sdk_test/config.yaml, mas há os seguintes pontos a serem observados:

3,1 、 BCCSP

Na aplicação do segredo nacional go-sdk, este item deve ser comentado.

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

Como o SDK converterá automaticamente o algoritmo, não precisamos defini-lo como GM. Claro, SWnão há problema se você defini-lo como o arquivo de configuração original . Aqui usamos as configurações padrão por padrão.

3,2 、 tlsCerts

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

Se você estiver usando um sistema operacional Windows, altere-o para falso aqui. Observe que há um espaço entre os dois pontos e "verdadeiro". Se você é um sistema como Centos ou Ubuntu, você não precisa alterá-lo, se você é um sistema operacional Mac, haverá alguns problemas se você não alterá-lo aqui, mas podemos modificar sm2o código-fonte para resolvê-lo. Falarei sobre isso mais tarde, quando você usá-lo.

3.3, todos os caminhos

Todos os caminhos relacionados no arquivo de configuração /Users/shitaibin/go/src/github.com/hyperledger/fabric/fabric-samplesdevem ser substituídos pelo seu caminho real local. Observe que não há no Windows. /Estima-se que ele deva ser usado \\(isso não é certo).

Quarto, escreva arquivos de teste

Este artigo usa um main.goarquivo de teste simples como o arquivo de teste. O método de gravação do arquivo de teste também se refere ao artigo "Usando o fabric-sdk-go para operar o código em cadeia" mencionado acima. Use seu editor ou vimcrie um no diretório raiz do projeto com o main.goseguinte conteúdo:

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
}

O arquivo de teste é muito simples, primeiro inicialize o SDK e estabeleça um canal, depois consulte o contrato, execute a transação e consulte o contrato para ver se o valor está atualizado.

Cinco, dependências de instalação

Aí vem a questão: há muitas operações aqui. Presumimos que você sdk_testesteja operando no diretório raiz do projeto , e o SDK da versão do segredo nacional também está colocado no $GOPATH/src/github.com/hyperledger/diretório, conforme recomendado :

go run main.go

A dependência será instalada primeiro e, em seguida, um erro será relatado ao analisar o certificado x509. Ignore-o e o resultado será normal.
Em seguida, execute:

go mod vendor

Copie todas as dependências para o diretório do fornecedor do projeto.
Em seguida, execute:

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

O significado do comando acima é excluir go modo conteúdo relevante e usar o SDK secreto nacional para substituir o SDK nativo.

Seis, faça o teste

Vamos executá-lo novamente go run main.go. Se você for avisado de que algumas bibliotecas estão faltando, você pode abrir um novo terminal e baixá-lo consultando o seguinte comando:

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

Após a conclusão do download, execute o programa no terminal original. Aqui, haverá resultados diferentes de acordo com os diferentes sistemas operacionais:

1. Centos ou Ubuntu

A operação foi bem-sucedida. No log de saída, podemos ver que o valor de a no código da cadeia está correto.

2 、 janelas

Um erro será relatado ao executar no ambiente do Windows (observe que o systemCertPool no arquivo de configuração do Windows deve 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

Isso ocorre porque a biblioteca é muito antiga e precisamos atualizá-la manualmente.

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

Copie a biblioteca baixada para o diretório correspondente ao fornecedor para substituí-la. Execute go run main.go-o novamente e ele terá sucesso.

3、Mac OS

Porque o Mac sob o arquivo de configuração systemCertPoolestá truena versão fechada do país encontrará os arquivos que não correspondem e inicializados nil, portanto, erro. Após o teste, o Fabric original com o fabric-sdk-go original não terá esse problema. Esse problema ocorre porque, no sm2/cert_pool.goarquivo, os locais de arquivo possíveis no Mac OS não estão listados. De acordo com a mensagem de erro, nós o abrimos vendor/github.com/fabric-sdk-go/internal/github.com/tjfoc/gmsm/sm2/cert_pool.go(vscode é recomendado) e você pode ver que existem duas definições:

// 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
}

O programa inicializa o conjunto de certificados do sistema no arquivo ou caminho listado acima.

Embora haja um "/etc/ssl/certs"diretório no Mac OS , ele está vazio. Portanto, depois do Google, precisamos certFilesadicionar uma definição no Mac OS "/usr/local/etc/openssl/cert.pem", // Macpara alterá-la para:

// 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
}

Salve e saia e execute novamente go run main.go, o valor de a será reproduzido corretamente.

Sete, resumo

Bem, da perspectiva deste artigo, é bastante simples testar o tecido do segredo nacional-sdk-go com o tecido do segredo nacional (principalmente o aplicativo go-sdk, o segredo nacional sdk foi escrito por outros). Muito obrigado pelo bolenzhanglançamento do armazém nacional secreto fabric-go-sdk-gm. Os leitores que o usam podem githubfazer um pedido star.

Até agora, a transformação do segredo de estado do Fabric Hyperledger com base na versão online de código aberto do aplicativo é atualmente apenas um Fabric CA. Depois que esta CA etc. encontrar uma versão secreta nacional de código aberto adequada, escreverei um artigo para apresentar seu uso.

Para testar o CA, meu ambiente local foi alterado para o Fabric original. Portanto, a maior parte do conteúdo deste artigo é escrito da memória e não há nenhuma etapa de controle real. Se houver omissões ou erros, deixe uma mensagem para correção ou discussão.

Acho que você gosta

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