如何设计适合您业务的超级账本链码?

how to design your chaincode of hyperledger to fit for your business?

我正在关注链码开发指南:https://github.com/hyperledger/fabric/blob/07ea01124b2768ee04a6b30fe29a6395f6d3d819/docs/API/SandboxSetup.md

以我的测试结果,在生产环境(不是开发环境,不是--peer-chaincodedev),deploy方法的工作负载(比如系统运行时间和存储大小)比调用方法。

如果测试结果是正确的,我想部署方法的成本比调用方法要高得多。成本的1,000,000倍以上

在这样的成本情况下,我们应该做什么样的设计呢?频率多少合适

比如我们应该如何避免调用deploy方法?我们应该如何使用invoke方法来代替deploy方法?

  1. 部署一次,链代码名称是更好的业务名称,而不是进程名称。

func (t *Chaincode) Init(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
 var err error
 var Number string
 if len(args) != 1 {return nil, errors.New("sign Init Expecting 1 number of arguments.")}
 Number = args[0]
 err = stub.PutState(Number, []byte("01"))
 if err != nil {return nil, err}

 return nil, nil
}

  1. 使用 invoke 方法避免部署新链代码的方法。

func (t *Chaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
 if function == "delete" {
  // Deletes an entity from its state
  return t.delete(stub, args)
 }
 
 if function == "newcontract" {
  // Deletes an entity from its state
  return t.delete(stub, args)
 }
 
 xxxxxxxxxxxxxxxxxxxx
 return nil, nil
}

func (t *SimpleChaincode) Query(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
 if function != "query" {
  return nil, errors.New("Invalid query function name. Expecting \"query\"")
 }
 
 xxxxxxxxxxxxxxxxxxxx
 return xxx, nil
}

// Deletes an entity from state

func (t *SimpleChaincode) delete(stub *shim.ChaincodeStub, args []string) ([]byte, error) {
 if len(args) != 1 {
  return nil, errors.New("Incorrect number of arguments. Expecting 1")
 }

 A := args[0]

 // Delete the key from the state in ledger
 err := stub.DelState(A)
 if err != nil {
  return nil, errors.New("Failed to delete state")
 }

 return nil, nil
}