运行时的链码行为

问题描述 投票:0回答:1

当前正在学习一些有关使用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

}
 ......

在初始化函数期间,我在初始化链码时传递了一个人。然后我的问题是:再次针对链码调用。 p实例是否仍将保留在init函数中,以便我可以读取init期间给出的p.name?链码如何管理这个?

hyperledger-fabric hyperledger hyperledger-chaincode
1个回答
1
投票

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

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

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

我建议您检查FabCar示例,如果您还没有:https://github.com/hyperledger/fabric-samples/blob/release-1.4/chaincode/fabcar/go/fabcar.go

initLedger交易使世界状态增加了10辆汽车。 queryCar事务从世界状态读取汽车。还有其他事务可用于查询所有汽车或更新汽车所有者。

© www.soinside.com 2019 - 2024. All rights reserved.