Hyperledger fabric 运行时链码的行为

Hyperledger fabric 运行时链码的行为,hyperledger-fabric,hyperledger,hyperledger-chaincode,Hyperledger Fabric,Hyperledger,Hyperledger Chaincode,目前正在学习使用GO开发链码(最近与以太坊合作)。我有以下代码: type Person struct { name string // assume json fields for marshaling etc. lastname string // ... SSN string // ... } func (p *Person) Init(stub shim.ChaincodeStubInterface) Response { args := stub.G

目前正在学习使用GO开发链码(最近与以太坊合作)。我有以下代码:

type Person struct {
    name string // assume json fields for marshaling etc.
    lastname string // ...
    SSN string //  ...
}

func (p *Person) Init(stub shim.ChaincodeStubInterface) Response {
    args := stub.GetArgs()
    var person Person
    // just assume that args[0] is a json
    json.Unmarshal(args[0], person )
    p.name = person.name
    p.lastname = person.lastname
    p.SSN = person.SSN

}
 ......

在初始化函数期间,我在链码的初始化过程中传递一个人。那么,我的问题是:在另一次针对链码的呼叫中。是否仍然从init函数中持久化p实例,以便我可以读取init期间给定的p.name?链码是如何管理的?

如果您尝试它,您可能会发现它似乎被持久化了,但它只会被持久化到内存中。如果链码重新启动,或者对等端重新启动,则数据将丢失。因此,这不是推荐的方法

Chaincode可以访问各种存储—世界状态(类似于以太坊中的世界状态)和私有数据收集。存储在世界状态中的数据在通道的所有成员之间共享

您可以使用
stub.PutState(key,value)
将数据放入世界状态,并使用
stub.GetState(key)
从世界状态获取数据。您的
Init
函数应该将数据存储在世界状态,然后您的
Invoke
函数可以在处理任何事务时将数据从世界状态中取出

如果您还没有:

initLedger
事务将向世界状态添加10辆汽车。
queryCar
事务从世界国家读取汽车。还有其他事务用于查询所有汽车或更新车主