在合约部署的时候会调用Initialize方法
首先获取到部署命令中的owner参数表示用户名 然后调用链上的方法GetObject来查询该用户名对应的value
智能合约调用的链上的方法就2个 一个是PutObject 将key-value保存到链上
另外一个是GetObject 根据key获取对应的value
如果value为空的话 则初始化一个空的user对象 并转换成json字符串上链保存
合约上链交易的方法
这个方法首先根据owner(代表用户名称)去链上查询对应的value 根据上面的分析 该value保存着一个用户对象,第一次调用的时候该用户对象是里面的属性都没有进行初始化呢 然后调用putFile方法
首先初始化一个UserFile对象 这里面保存了一条上链的信息
将该对象作为一个元素 保存到 user对象里面的userfiles这个map集合中 key是filehash value是userFile
然后将用户对象转换成json字符串保存到链上
合约交易查询
根据filehash遍历该用户对象的userfiles这个map集合 找到对应的userfile元素
截止到这里 是不是发现了 这个存证合约模版的逻辑其实很简单
总结下上面的逻辑
智能合约调用链上的2个方法
- PutObject 将k-v上链保存
- GetObject 通过k查询v
一个数据结构
- 一个user对象 里面有一个map集合 里面的元素是每次上链的数据 可以通过map的key来定位到那一条上链数据
问题发现
filehash重复
大家看过上面的代码有没有发现一个问题
圈红的地方是将单次上链数据userFile 放入map集合中 ,key是filehash,如果2次上传的filehash相同,那么就会把之前的filehash对应的value值给替换掉
但是呢 相同的上链数据却返回不同的交易id,内部实现机制是怎样的和如果根据公司的业务来定义数据结构以实现智能合约等下一篇文章咱们再分析下。