链代码在运行时的行为

behavior of chaincode during runtime

目前正在学习一些关于使用 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 ?链码如何管理这个?

你试一下可能会发现它好像是持久化的,但它只会持久化在内存中。如果链码重启,或者节点重启,那么数据就会丢失。所以这不是推荐的方法。

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 事务从世界状态读取汽车。还有其他用于查询所有汽车或更新车主的事务。