本周工作
周一(8.13)
- 当日目标
1、完成department相关的页面的功能(增、改、查)2、了解清楚entity的相关的需求,entity的页面开始- 3、请教一下,同时配置一下,调试使用Fabric Node SDK进行Invoke和Query这个代码的环境,最好在自己这也能跑起来。
4、看代码中新的知识点,标记到上周(32W02)的文档里。
- 当日工作
- 1、目标(1,2,4)完成。
- 2、16点完成目标(1,4)后,花了近2小时调查和下载了关于 多线程和 数据结构&算法方面的电子书,以及学习一下这两个主题的学习曲线是啥。但并没有啥结果呢,倒是有个文章不错,与我有共鸣。【当然,在这两个主题上要花 笨功夫。】
- 3、19点后,测试环境上部署好entity相关的链码。
周二(8.14)
- 当日目标
1、entity相关的(增、改、查)完成。2、自己理一下de相关的需求,在entity里面进行相应的逻辑处理。这地方有些坑,需要再问一下3、Node SDK的Invoke和Query跑通,并拆分成2个函数。
- 当日工作
- 目标(1,2,3)完成。
- 看了一下现有代码里的Invoke和Query本来就是OK的,只是把
Event
相关的重新再写个函数,然后调试一下。这个怎么关联业务,还是调试和请教一下。 - 一些小的tips:
- 1、再度复习一下HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法,*以前只是粗略的看看,现在运行一遍后,再次看看文档。
- (1)
function, args := stub.GetFunctionAndParameters()
将字符串数组的参数分为两部分,数组第一个字是Function,剩下的都是Parameter - (2)在对数据库进行操作时
GetState(key)
用到了json相关的处理 没想到这个知识点提到的知识还是蛮多的
- (3)复合键的处理项目中没用过
- (4)获得当前用户项目中也没用到
- (5)高级查询
resultsIterator, _ := stub.GetHistoryForKey(entity.Key)
- (6)调用另外的链上代码项目中也没用到
- (7)获得提案对象Proposal属性项目中也没用到
- (8)事件设置SetEvent
- 2、webstorm快捷键一览
ctrl+shift+/
块注释- 写代码时
tab
键的妙用,在vs2013里也有,相当于按Enter
ctrl+shift+alt+N
通过一个字符快速查找位置alt+up/down
文件中上一个/下一个方法,这个不像VS提供了方法预览,或者我没找到ctrl+shift+F
,在项目中查找
- 3、find命令中的size参数,当然exec参数没看
周三(8.15)
- 当日目标
- 1、将DE相关的业务,融合到entity里面去。
- 2、调试一下event相关的流程
- 当日工作
- 目标(1,2)都没有很好的完成
- 1、之前查询所有值是,是通过department.go结构体里的
Table
查询的,而entity.go里不想用Table
来标注的话,查询条件为空,能否查出所有值,这样可以直接Query后显示出来。
- (1)搭建的couchDB的环境里,执行
{ "selector": { "_id": { "$gt": null } } }
是可以查询到的。
- 2、由于链码中的Get实现与之前的不同,必须要有Key这样的参数才行,如果想实现一开始就加载,就得用之前的方法显示所有,然后取到相应的Key才行。
- 3、chaincode上重新写了一个
EntityQuery()
,但node.js和前端方面只是改了一下没调呢。
- 当日短板
- couchDB这种非关系型数据库,如何进行操作,命令行,代码传参的方式。
async
和await
了解一下
周四(8.16)
- 当日目标
- 1、调试好EntityQuery,并调试出能够在add后返回刚生成的key,chaincode中EntityQuery里返回出key的,EntityQuery是没用这个字段拼出来,所以前台console.log()时的值是
[]
。 - 2、EntityAdd时之前是能存到couchDB的,只是由于EntityGet方法无法显示到页面上,测试添加时,再console.log(key)看下是不是当前生成的key。*如果可以的话,根据这个key,再调用链码中DE的部分。
- 当日工作
- 1、完成了Entity的增、查、Update还在调试。如何取得Key,目前没找到解决方案。
- 2、工作tips:
- (1)、调试过程
http://localhost:5000/entity
显示不错,根据日志,定位到routers/manager.js的问题,顺便读了一下这个文件。http://localhost:5000/entity/query
还是报错,这个有请求,没有返回值,到chaincode的日志去查看,报“2018-08-16 02:09:11.584 UTC [shim] handleGetQueryResult -> ERRO 001 [d1989283]Received ERROR”,定位一下。
dockers logs -f
docker进程号,这个是显示链码里的日志- peer设备上也会显示相应的日志,可以两者结合看。
- 对比了代码,没发现啥,决定用peer脚本执行一下。
- 定位到了问题,但没有解决呢。由于在
Struct Entity{}
里定义了[]string
的类型,而在后面的代码中Unmarshal()
时可能需要转换。
- (2)、json串的marshal()中存在
[]string
时怎么转? - (3)、报错:“Error: Error endorsing query: rpc error: code = Unknown desc = chaincode error (status: 500, message: invalid character 'e' looking for beginning of value) -
<nil>
”,是在执行./test.sh chaincode query -C mychannel2 -n entity -c '{"Args":["EntityQuery","entity"]}'
时报的。
- 大概率是把"entity"拆成了e,n,这样的单个字符了。【这个自己假设错了,是链码写的有点问题。参见“当日请教后”】
- (4)、要加上
err.Error()
才能定位到错误的原因
if err != nil { return shim.Error("Detail func error:" + err.Error()) }
- 当日请教后get到的点 串起来一些知识
- 1、couchDB中这样的格式
{ "selector": { "Table": "entity" } }
表示的是富查询。所以代码中 type MangoEntity struct { SelectorEntity Entity json:"selector"
},这里面json的值必须是selector
,大小写也得一样,不然不认识。 - 2、因为代码中写的是
err := json.Unmarshal([]byte(args[0]), &o)
,所以执行脚本时的参数需要改变一下格式./test.sh chaincode query -C mychannel2 -n entity -c '{"Args":["EntityQuery","{\"Table\":\"entity\"}"]}'
args[0]
是指第一个参数,如:"{\"Table\":\"entity\"}"
- 3、定位到chaincode的报错“Incorrect parameters,please check your parameters”,之前的代码也是用
Unmarshal()
转的,对比了半天没想到问题,这是我args的值“ [ '{"EntityName":"JSON","DepartmentKey":"1584189241","Number":"200","Table":"entity"}' ]”,把相应逻辑一说,人家直接说Number是int
型。
- 于是前端用
parseInt()
转了一下condition.Number = parseInt(ctx.request.body.Number);
这个才是真实的int值。 condition.Number = parseInt("ctx.request.body.Number");
这个时候值是null
也成功插入到couchDB里了。
本周随想
新技术学习
- 周二想到的
- C++里面的关键字得用代码测试一下。目前想做的
&
,sizeof()
,typedef
,当时只是搜了一下,并没有调试以及内化为自己的知识。
- 周三想到的
- 1、couchDB这种,如何查询,用命令行、参数、页面查询。
- 2、用自己的电脑搭建一个Solidity 官方文档中文版,自己写一个helloworld,看看是啥流程。
- 3、Docker方面的书,还是得好好看看,具体是啥思路,其实并不是太懂。晚上回去翻了下,但没啥思路
- 周四想到的
转载于:https://my.oschina.net/u/673310/blog/1927912