链代码在运行时的行为
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
事务从世界状态读取汽车。还有其他用于查询所有汽车或更新车主的事务。
目前正在学习一些关于使用 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
事务从世界状态读取汽车。还有其他用于查询所有汽车或更新车主的事务。