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-network
diretório e ./byfn.sh up
inicie 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/hyperledger
diretó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 env
verificar GO111MODULE
se 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 mod
para gerenciar dependências. Todas as dependências precisam ser colocadas no diretório do fornecedor, mas podemos usá-lo primeiro go mod
para 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, SW
nã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 sm2
o 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-samples
devem 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.go
arquivo 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 vim
crie um no diretório raiz do projeto com o main.go
seguinte 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_test
esteja 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 mod
o 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 systemCertPool
está true
na 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.go
arquivo, 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 certFiles
adicionar uma definição no Mac OS "/usr/local/etc/openssl/cert.pem", // Mac
para 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 bolenzhang
lançamento do armazém nacional secreto fabric-go-sdk-gm. Os leitores que o usam podem github
fazer 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.