125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
// Copyright IBM Corp. All Rights Reserved.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
cb "github.com/hyperledger/fabric-protos-go/common"
|
|
ab "github.com/hyperledger/fabric-protos-go/orderer"
|
|
"github.com/hyperledger/fabric/bccsp/factory"
|
|
"github.com/hyperledger/fabric/msp"
|
|
mspmgmt "github.com/hyperledger/fabric/msp/mgmt"
|
|
"github.com/hyperledger/fabric/orderer/common/localconfig"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
type broadcastClient struct {
|
|
ab.AtomicBroadcast_BroadcastClient
|
|
}
|
|
|
|
func (bc *broadcastClient) broadcast(env *cb.Envelope) error {
|
|
var err error
|
|
var resp *ab.BroadcastResponse
|
|
|
|
err = bc.Send(env)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
resp, err = bc.Recv()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Status:", resp)
|
|
return nil
|
|
}
|
|
|
|
// cmdImpl holds the command and its arguments.
|
|
type cmdImpl struct {
|
|
name string
|
|
args argsImpl
|
|
}
|
|
|
|
// argsImpl holds all the possible arguments for all possible commands.
|
|
type argsImpl struct {
|
|
consensusType string
|
|
creationPolicy string
|
|
chainID string
|
|
}
|
|
|
|
var conf *localconfig.TopLevel
|
|
|
|
func init() {
|
|
var err error
|
|
conf, err = localconfig.Load()
|
|
if err != nil {
|
|
fmt.Println("failed to load config:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Load local MSP
|
|
mspConfig, err := msp.GetLocalMspConfig(conf.General.LocalMSPDir, conf.General.BCCSP, conf.General.LocalMSPID)
|
|
if err != nil {
|
|
panic(fmt.Errorf("Failed to load MSP config: %s", err))
|
|
}
|
|
err = mspmgmt.GetLocalMSP(factory.GetDefault()).Setup(mspConfig)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to initialize local MSP: %s", err))
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
cmd := new(cmdImpl)
|
|
var srv string
|
|
|
|
flag.StringVar(&srv, "server", fmt.Sprintf("%s:%d", conf.General.ListenAddress, conf.General.ListenPort), "The RPC server to connect to.")
|
|
flag.StringVar(&cmd.name, "cmd", "newChain", "The action that this client is requesting via the config transaction.")
|
|
flag.StringVar(&cmd.args.consensusType, "consensusType", "solo", "In case of a newChain command, the type of consensus the ordering service is running on.")
|
|
flag.StringVar(&cmd.args.creationPolicy, "creationPolicy", "AcceptAllPolicy", "In case of a newChain command, the chain creation policy this request should be validated against.")
|
|
flag.StringVar(&cmd.args.chainID, "chainID", "mychannel", "In case of a newChain command, the chain ID to create.")
|
|
flag.Parse()
|
|
|
|
signer, err := mspmgmt.GetLocalMSP(factory.GetDefault()).GetDefaultSigningIdentity()
|
|
if err != nil {
|
|
fmt.Println("Failed to load local signing identity:", err)
|
|
os.Exit(0)
|
|
}
|
|
|
|
conn, err := grpc.Dial(srv, grpc.WithInsecure())
|
|
defer func() {
|
|
_ = conn.Close()
|
|
}()
|
|
if err != nil {
|
|
fmt.Println("Error connecting:", err)
|
|
return
|
|
}
|
|
|
|
client, err := ab.NewAtomicBroadcastClient(conn).Broadcast(context.TODO())
|
|
if err != nil {
|
|
fmt.Println("Error connecting:", err)
|
|
return
|
|
}
|
|
|
|
bc := &broadcastClient{client}
|
|
|
|
switch cmd.name {
|
|
case "newChain":
|
|
env := newChainRequest(
|
|
cmd.args.consensusType,
|
|
cmd.args.creationPolicy,
|
|
cmd.args.chainID,
|
|
signer,
|
|
)
|
|
fmt.Println("Requesting the creation of chain", cmd.args.chainID)
|
|
fmt.Println(bc.broadcast(env))
|
|
default:
|
|
panic("Invalid command given")
|
|
}
|
|
}
|