如何设计适合您业务的超级账本链码?
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方法?
- 部署一次,链代码名称是更好的业务名称,而不是进程名称。
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
}
- 使用 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
}
我正在关注链码开发指南:https://github.com/hyperledger/fabric/blob/07ea01124b2768ee04a6b30fe29a6395f6d3d819/docs/API/SandboxSetup.md
以我的测试结果,在生产环境(不是开发环境,不是--peer-chaincodedev),deploy方法的工作负载(比如系统运行时间和存储大小)比调用方法。
如果测试结果是正确的,我想部署方法的成本比调用方法要高得多。成本的1,000,000倍以上
在这样的成本情况下,我们应该做什么样的设计呢?频率多少合适
比如我们应该如何避免调用deploy方法?我们应该如何使用invoke方法来代替deploy方法?
- 部署一次,链代码名称是更好的业务名称,而不是进程名称。
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
}
- 使用 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
}