当前正在学习一些有关使用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
事务从世界状态读取汽车。还有其他事务可用于查询所有汽车或更新汽车所有者。