使用Fabric-Go-SDK实现客户端操作

一、下载SDK

下载SDK到GOPATH路径中:

go get -u github.com/hyperledger/fabric-sdk-go

二、配置

$GOPATH\src\github.com\hyperledger\fabric-sdk-go\test\fixtures\config目录下 能够找到一些配置文件模板,以下我的配置:

version: 1.0.0
client:
  organization: org1
  logging:
    level: info
  cryptoconfig:
    path: /home/vagrant/fabric/crypto-config
  credentialStore:
    path: "/tmp/hfc-kvs"
    cryptoStore:
      path: /tmp/msp
  BCCSP:
    security:
      enabled: true
      default:
        provider: "SW"
      hashAlgorithm: "SHA2"
      softVerify: true
      level: 256
  tlsCerts:
    systemCertPool: false
    client:
      key:
        path: /home/vagrant/fabric/crypto-config/peerOrganizations/org1.36sn.com/users/User1@org1.36sn.com/tls/client.key
      cert:
        path: /home/vagrant/fabric/crypto-config/peerOrganizations/org1.36sn.com/users/User1@org1.36sn.com/tls/client.crt
channels:
  # 管道名
  zsjr:
    peers:
      peer0.org1.36sn.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
    policies:
      queryChannelConfig:
        minResponses: 1
        maxTargets: 1
        retryOpts:
          attempts: 5
          initialBackoff: 500ms
          maxBackoff: 5s
          backoffFactor: 2.0
organizations:
  org1:
    mspid: Org1MSP
    cryptoPath:  peerOrganizations/org1.36sn.com/users/{username}@org1.36sn.com/msp
    peers:
      - peer0.org1.36sn.com
peers:
  peer0.org1.36sn.com:
    url: peer0.org1.36sn.com:7051
    grpcOptions:
      ssl-target-name-override: peer0.org1.36sn.com
      fail-fast: false
      allow-insecure: false
    tlsCACerts:
      path: /home/vagrant/fabric/crypto-config/peerOrganizations/org1.36sn.com/tlsca/tlsca.org1.36sn.com-cert.pem

三、编写客户端

package main

import (
	"fmt"
	"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
	"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/retry"
	"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
	"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
	"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
	"log"
)

const (
	channelID      = "zsjr"
	orgName        = "Org1"
	orgAdmin       = "Admin"
	ordererOrgName = "Orderer"
	ccID           = "example"
)

// ExampleCC query and transaction arguments
var queryArgs = [][]byte{[]byte("b")}
var txArgs = [][]byte{[]byte("a"), []byte("b"), []byte("1")}

func setupAndRun(configOpt core.ConfigProvider, sdkOpts ...fabsdk.Option) {
	//Init the sdk config
	sdk, err := fabsdk.New(configOpt, sdkOpts...)
	if err != nil {
		log.Panicf("Failed to create new SDK: %s", err)
	}
	defer sdk.Close()
	// ************ setup complete ************** //

	//prepare channel client context using client context
	clientChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser("Admin"), fabsdk.WithOrg(orgName))

	// Channel client is used to query and execute transactions (Org1 is default org)
	client, err := channel.New(clientChannelContext)

	if err != nil {
		log.Panicf("Failed to create new channel client: %s", err)
	}

	value := queryCC(client)
	fmt.Printf("value is %s\n", string(value))

	// Move funds
	executeCC(client)
}

func executeCC(client *channel.Client) {
	_, err := client.Execute(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: txArgs},
		channel.WithRetry(retry.DefaultChannelOpts))
	if err != nil {
		log.Panicf("Failed to move funds: %s", err)
	}
}

func queryCC(client *channel.Client) []byte {
	response, err := client.Query(channel.Request{ChaincodeID: ccID, Fcn: "query", Args: queryArgs},
		channel.WithRetry(retry.DefaultChannelOpts))
	if err != nil {
		log.Panicf("Failed to query funds: %s", err)
	}
	fmt.Println(response)

	return response.Payload
}

func main() {
	configPath := "./config.yaml"
	//End to End testing
	setupAndRun(config.FromFile(configPath))
}

该客户端完成两个功能 * 账户余额查询 * 由A账户向B账户转款

http://cw.hubwiz.com/card/c/fabric-chaincode-node/1/2/20/ https://help.aliyun.com/document_detail/140545.html?spm=a2c4g.11186623.6.730.6d022f52aO4nFR https://www.jianshu.com/p/c155e738f4f6

https://github.com/dhqiao/light/blob/ef925c9d47ecc1a24f8b551c9b0bb5d15db37a29/service/chain/ledger.go https://github.com/fieldlee/browser/blob/646487b4c5f4a2e383441b5e0ea3d687f5b63e5b/handle/handle.go