-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
3312 lines (3029 loc) · 408 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>区块链中常用共识算法总结(持续更新)</title>
<url>/2018-10-01-consensus-algorithm/</url>
<content><![CDATA[<h2 id="1-POW(Proof-Of-Work)"><a href="#1-POW(Proof-Of-Work)" class="headerlink" title="1. POW(Proof Of Work)"></a>1. POW(Proof Of Work)</h2><hr>
<ul>
<li>一句话介绍:劳动致富,多劳者多得!</li>
<li>描述:POW中文翻译是工作量证明。采用此共识的数字货币有比特币、莱特币等。工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。这种系统要求得到证明的过程是低效且漫长的,可是校验则是高效且迅速,概括起来就是求解难,验证容易。<br>比特币是第一个区块链应用,同时也是最著名的应用之一,它所使用的共识机制就是POW。那么具体是怎么实现的呢?<br>在比特币中,使用了SHA256这种哈希函数作为求解手段。SHA256有以下特征:<blockquote>
<ol>
<li>是一种散列函数,即相邻的x1和x2,求得的f(x1)和f(x2)差别极大。</li>
<li>不可逆推,给定了f(x)的值,推断不出输入值。</li>
<li>不存在比穷举更好的方法,可以使f(x)落在特定的范围。</li>
</ol>
</blockquote>
<span id="more"></span>
实际使用过程中,每个节点需要打包的交易数据相同,再从尾部加一个随机数(节点自己选)作为整体输入来求输出值,把结果和当前的挖矿难度对比(要求输出值前x位为0),满足条件则向附近节点广播;不满足则更换随机数继续求解。最快求得解的节点,则可以视为挖矿胜出,取得其他节点的共识。</li>
</ul>
<p>目前比特币已经吸引了全球大部分的运算能力,其他再使用PoW共识机制的区块链应用很难获得相同的计算能力来保障自身的安全,从而无法复制比特币的辉煌;同时由于挖矿造成大量的资源被浪费,共识达成的周期很长,导致了比特币的TPS(transaction per second,每秒执行事务数量)极低,只有个位数。</p>
<ul>
<li>优点:<br>算法简单,容易实现;<br>节点间无需交换额外的信息即可达成共识;<br>破坏系统需要投入极大的成本;</li>
<li>缺点:<br>浪费能源;<br>区块的确认时间难以缩短;<br>新的区块链必须找到一种不同的散列算法,否则就会面临算力攻击;<br>容易产生分叉,需要等待多个确认;<br>永远没有最终性,需要检查点机制来弥补最终性;<h2 id="2-POS-Proof-of-Stake)"><a href="#2-POS-Proof-of-Stake)" class="headerlink" title="2. POS( Proof of Stake)"></a>2. POS( Proof of Stake)</h2></li>
</ul>
<hr>
<ul>
<li>一句话介绍:持有越多,获得越多。</li>
<li>提出目的:解决POW51%攻击</li>
<li>描述:<blockquote>
<p>不同的旷工计算不同的数学难题,这个数学难题和你的拥有币的时间/币的多少持反比例。拥有币时间越长,难度越低。持有币数量越多,难度越低。</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>POS通过区块链系统内部的虚拟资产来管理安全性,根据节点持有的通证数量或者时长来决定节点享有的权利大小。区块链系统的参与者锁定他们在该区块链上持有的虚拟资产(Coin或Token),他们会签署消息以达成一致意见。只有那些已经成为系统一部分的参与者才能够决定下一个区块的内容。</p>
</blockquote>
<blockquote>
<p>PoW共识算法从经济角度,可以自然做到防止区块链分叉(区块链分叉的本质就是网络各节点对区块链的生成产生分歧,无法达成共识)。但是PoS则需要精心设计好相应的规则来防止分叉,例如PoS可以设定惩罚机制,参与挖矿的矿工被要求锁定一定数量的虚拟资产。如果他们被侦测到了存在不当的行为,则系统会没收全部或部分被锁定的虚拟资产。</p>
</blockquote>
<ul>
<li>优点:<br>在一定程度上缩短了共识达成的时间;<br>不再需要大量消耗能源挖矿。</li>
<li>缺点:<br>还是需要挖矿,本质上没有解决商业应用的痛点;<br>所有的确认都只是一个概率上的表达,而不是一个确定性的事情,理论上有可能存在其他攻击影响。例如,以太坊的DAO攻击事件造成以太坊硬分叉,而ETC由此事件出现,事实上证明了此次硬分叉的失败。<h2 id="3-DPOS(Delegated-Proof-of-Stake)"><a href="#3-DPOS(Delegated-Proof-of-Stake)" class="headerlink" title="3. DPOS(Delegated Proof of Stake)"></a>3. DPOS(Delegated Proof of Stake)</h2></li>
</ul>
<hr>
<ul>
<li>一句话介绍:POS的升级版</li>
<li>提出目的:POW/POS浪费巨量算力。</li>
<li>描述:<br>DPoS机制,中文名叫做股份授权证明机制(又称受托人机制),代表数字货币是EOS。它的原理是让每一个通证的节点进行投票,选出集中多数票的节点,例如100个,然后这些节点会行使类似POS的权力。<br>DPOS利用利益相关方批准投票的权力以公平和民主的方式解决共识问题,所有网络参数,从费用估算到块间隔和交易规模,都可以通过选定的代表进行调整。从某种角度来看,DPOS有点像是议会制度或人民代表大会制度。如果代表不能履行他们的职责(当轮到他们时,没能生成区块),他们会被除名,网络会选出新的超级节点来取代他们。</li>
<li>优点:<br>大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证;<br>更加去中心化的机制;<br>拥有更高的处理效率</li>
<li>缺点:<br>整个共识机制还是依赖于token,很多商业应用是不需要token存在的。<h2 id="4-PBFT(Practical-Byzantine-Fault-Tolerance)"><a href="#4-PBFT(Practical-Byzantine-Fault-Tolerance)" class="headerlink" title="4. PBFT(Practical Byzantine Fault Tolerance)"></a>4. PBFT(Practical Byzantine Fault Tolerance)</h2></li>
</ul>
<hr>
<ul>
<li>一句话介绍:解决一切出现的故障</li>
<li>描述:拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或断开以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。拜占庭容错协议必须处理这些失效,并且这些协议还要满足所要解决的问题要求的规范。</li>
</ul>
<blockquote>
<p>PBFT算法的核心理论是n>=3f+1<br>n是系统中的总节点数,f是允许出现故障的节点数。换句话说,如果这个系统允许出现f个故障,那么这个系统必须包括n个节点,才能解决故障。</p>
</blockquote>
<ul>
<li>优点:PBFT在很多场景都有应用,在区块链场景中,一般适合于对强一致性有要求的私有链和联盟链场景。(Hyperledger Fabric 在 0.6 版中应用了 PBFT,而在 1.0 版中放弃了 PBFT,转而采用效率更高的 Kafka,支持单点和集群两种方式,由 Kafka 直接给交易排序和出块)<h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2></li>
</ul>
<hr>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://www.huoxing24.com/newsdetail/20190129104157764083.html</span><br><span class="line">https://blog.csdn.net/yuanfangyuan_block/article/details/84593786</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://www.jianshu.com/p/b56ab577222d">Description</a></p>
]]></content>
<categories>
<category>区块链</category>
</categories>
<tags>
<tag>blockchain</tag>
</tags>
</entry>
<entry>
<title>Goland远程连接Linux开发调试</title>
<url>/2018-10-21-goland-linux-debug/</url>
<content><![CDATA[<p>打开Goland,选择File=》Plugins=》Install JetBrains plugins</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/df65cae30df44e248627f8f694a37e0f" alt="image"></p>
<p>搜索Remote Hosts Access,点击Install</p>
<span id="more"></span>
<p><img src="http://p1.pstatp.com/large/pgc-image/62f54c080e25416197d4f39ea3cff34a" alt="image"></p>
<p>安装好之后,重启GoLand</p>
<p>配置</p>
<p>Settings=》build, execution, deployment=》deployment</p>
<p>Add Server:命名和选择SFTP</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/e7ea20e838b048f486d393fd827de93a" alt="image"></p>
<p>Connection里面的设置:</p>
<p>SFTP host:填写服务器ip</p>
<p>Root path:服务器的go项目存放路径,例如我配置的是/home/Go/go-project</p>
<p>User name:服务器账号</p>
<p>Password:服务器密码</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/479f25e17f0248de9bb1a06bff1f8adb" alt="image"></p>
<p>Mappings里面的设置:</p>
<p>Local path:本地电脑的项目路径</p>
<p>Deployment path on server:具体某个项目的路径</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/0c45927233ec4ce1817c3e110bd906bd" alt="image"></p>
<p>配置完成!</p>
<p>把服务器项目下载到本地的项目文件中(2种情况:项目未下载过本地或已下载过本地):</p>
<p>1、之前未把项目下载到本地:</p>
<p>(1)、Tools=》Deployment=》Browse Remote Host</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/ad416c9ea7264cb0a0b3df07a9bbf3c3" alt="image"></p>
<p>(2)弹出Remote Host之后,右键选择项目=》Download from here</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/912500691cef4e2da1d5e803e5f2a135" alt="image"></p>
<p>2、项目已下载的本地</p>
<p>Tools=》Deployment=》Download from xxx</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/0c45927233ec4ce1817c3e110bd906bd" alt="image"></p>
<p>本地代码修改完成之后,上传到服务器更新:</p>
<p>Tools=》Deployment=》Upload to xxx</p>
<p><img src="http://p1.pstatp.com/large/pgc-image/6ac5ba9dfebf4d82bb9a36442c588e95" alt="image"></p>
]]></content>
<categories>
<category>技术教程</category>
</categories>
<tags>
<tag>linux</tag>
<tag>golang</tag>
<tag>goland</tag>
</tags>
</entry>
<entry>
<title>Centos7.5安装部署Golang、Beego框架</title>
<url>/2018-10-25-centos7-install-beego/</url>
<content><![CDATA[<h3 id="安装Golang"><a href="#安装Golang" class="headerlink" title="安装Golang"></a>安装Golang</h3><hr>
<ol>
<li>进入home目录下<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /home </span><br></pre></td></tr></table></figure></li>
<li>mkdir Go 创建一个Golang的目录<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir Go</span><br><span class="line">cd Go</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/1539564410823d00ecea058" alt="image"><span id="more"></span></li>
<li>在 <a href="http://www.studygolang.com/dl">http://www.studygolang.com/dl</a> 找到go对应的安装包</li>
</ol>
<p><img src="http://p1.pstatp.com/large/pgc-image/15395644106433baa6d69d9" alt="image"></p>
<p><img src="http://p3.pstatp.com/large/pgc-image/15395644106481993cbc43b" alt="image"></p>
<ol start="4">
<li><p>复制下载文件链接,在命令行执行代码:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz</span><br></pre></td></tr></table></figure>
<p><img src="http://p3.pstatp.com/large/pgc-image/15395644106608d343392ab" alt="image"></p>
</li>
<li><p> 解压缩</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar xzvf go1.11.linux-amd64.tar.gz</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/15395644106673de1d27576" alt="image"></p>
</li>
<li><p>设置环境变量:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi ~/.bashrc</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/15395644106498fc0558985" alt="image"></p>
</li>
<li><p>添加:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export GOROOT=/home/Go/go</span><br><span class="line">export PATH=$GOROOT/bin:$PATH</span><br><span class="line">export GOPATH=/home/Go/go-project</span><br><span class="line">export PATH=$PATH:$GOPATH/bin</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/153956441077191b826e8e8" alt="image"></p>
</li>
</ol>
<p>8、填完执行:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source ~/.bashrc</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/15395644107748da33f31d2" alt="image"></p>
<h3 id="安装Beego"><a href="#安装Beego" class="headerlink" title="安装Beego"></a>安装Beego</h3><hr>
<ol>
<li>安装git<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum install git</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/1539564410765a5e5c9732a" alt="image"></li>
</ol>
<p><img src="http://p9.pstatp.com/large/pgc-image/1539564410775577057f8d8" alt="image"></p>
<ol start="2">
<li><p>git下载beego和bee</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go get -u -v [http://github.com/astaxie/beego](http://github.com/astaxie/beego)</span><br><span class="line">go get -u -v githubcom/beego/bee</span><br></pre></td></tr></table></figure>
<p>下载时等待一会儿,直到结束为止<br><img src="http://p1.pstatp.com/large/pgc-image/1539564410793a1c96192bd" alt="image"><br>此时,Go和beego就安装好了</p>
</li>
<li><p>测试:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd $GOPATH/src</span><br><span class="line">bee new class</span><br></pre></td></tr></table></figure>
<p>successfully,测试ok~<br><img src="http://p3.pstatp.com/large/pgc-image/15395644108936aead8c176" alt="image"></p>
</li>
<li><p>进入class目录</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd class</span><br></pre></td></tr></table></figure></li>
<li><p>运行mian.go文件</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go run main.go </span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/1539564410911f3deafd434" alt="image"></p>
</li>
<li><p>打开8080访问,显示欢迎页面,ok~<br><img src="http://p3.pstatp.com/large/pgc-image/153956441089129f32e7bba" alt="image"></p>
</li>
</ol>
]]></content>
<categories>
<category>技术教程</category>
</categories>
<tags>
<tag>golang</tag>
<tag>centos</tag>
<tag>beego</tag>
</tags>
</entry>
<entry>
<title>Centos7安装部署Nginx、Php7.2、MySQL5.7、WordPress</title>
<url>/2018-10-24-centos7-install-wordpress/</url>
<content><![CDATA[<h3 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h3><hr>
<p>WordPress基于PHP开发的,本文采用Centos7.3、Nginx、MySQL5.7、PHP7.2部署。</p>
<h3 id="设置阿里云镜像"><a href="#设置阿里云镜像" class="headerlink" title="设置阿里云镜像"></a>设置阿里云镜像</h3><hr>
<ol>
<li>备份原来的yum源<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup </span><br></pre></td></tr></table></figure>
<span id="more"></span></li>
<li>设置阿里云的yum源<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo </span><br></pre></td></tr></table></figure></li>
<li>添加epel源<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo </span><br></pre></td></tr></table></figure></li>
<li>清理缓存并生成新的缓存<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo yum clean all </span><br><span class="line">sudo yum makecache </span><br></pre></td></tr></table></figure>
<h3 id="安装Nginx"><a href="#安装Nginx" class="headerlink" title="安装Nginx"></a>安装Nginx</h3></li>
</ol>
<hr>
<ol>
<li>安装nginx源<br>执行以下命令,安装该rpm后,在<code>/etc/yum.repos.d/ </code>目录中看到一个名为<code>nginx.repo</code> 的文件<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm</span><br></pre></td></tr></table></figure></li>
<li>安装nginx<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum install -y nginx</span><br></pre></td></tr></table></figure></li>
<li>nginx的默认目录<blockquote>
<p>nginx配置路径:/etc/nginx/<br>pid目录:/var/run/nginx.pid<br>错误日志:/var/log/nginx/error<br>访问日志:/var/log/nginx/access.log<br>默认站点目录:/usr/share/nginx/html</p>
</blockquote>
</li>
</ol>
<p>只需知道nginx配置路径即可,一会儿仅需修改/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf </p>
<ul>
<li>修改配置文件<br>修改/etc/nginx/conf.d/default.conf中下面两段内容:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi /etc/nginx/conf.d/default.conf</span><br></pre></td></tr></table></figure>
更改前:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">location / {</span><br><span class="line"> root /usr/share/nginx/html;</span><br><span class="line"> index index.html index.htm;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
更改后:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"> root /usr/share/nginx/html;</span><br><span class="line"> index index.html index.htm index.php;</span><br><span class="line"> location / {</span><br><span class="line"> try_files $uri $uri/ /index.php$is_args$args;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
更改前:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#location ~ \.php$ {</span><br><span class="line"># root html;</span><br><span class="line"># fastcgi_pass 127.0.0.1:9000;</span><br><span class="line"># fastcgi_index index.php;</span><br><span class="line"># fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;</span><br><span class="line"># include fastcgi_params;</span><br><span class="line">#}</span><br></pre></td></tr></table></figure>
更改后:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">location ~ \.php$ {</span><br><span class="line"> fastcgi_pass 127.0.0.1:9000;</span><br><span class="line"> fastcgi_index index.php;</span><br><span class="line"> fastcgi_param SCRIPT_FILENAME $request_filename;</span><br><span class="line"> include fastcgi_params;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
修改 <code>/etc/php-fpm.d/www.conf</code>配置:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi /etc/php-fpm.d/www.conf</span><br></pre></td></tr></table></figure>
将<code>user = apache</code>改为<code>user = nginx</code>,将<code>group = apache</code>改为<code>group = nginx</code>。</li>
</ul>
<ol start="4">
<li>nginx的常用命令</li>
</ol>
<ul>
<li>启动<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/usr/sbin/nginx –s start</span><br><span class="line">//或者</span><br><span class="line">systemctl start nginx.service</span><br></pre></td></tr></table></figure></li>
<li>重启<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/usr/sbin/nginx –s reload</span><br><span class="line">//或者</span><br><span class="line">systemctl restart nginx.service</span><br></pre></td></tr></table></figure></li>
<li>关闭<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/usr/sbin/nginx –s stop</span><br><span class="line">//或者</span><br><span class="line">systemctl stop nginx.service</span><br></pre></td></tr></table></figure></li>
<li>查看进程<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ps -ef |grep nginx</span><br></pre></td></tr></table></figure>
<h3 id="安装MySQL"><a href="#安装MySQL" class="headerlink" title="安装MySQL"></a>安装MySQL</h3></li>
</ul>
<ol>
<li>安装MySQL5.7</li>
</ol>
<ul>
<li>下载并安装MySQL官方的 Yum Repository<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm</span><br></pre></td></tr></table></figure></li>
<li>yum安装<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum -y install mysql57-community-release-el7-10.noarch.rpm</span><br></pre></td></tr></table></figure></li>
<li>安装MySQL Sever<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum -y install mysql-community-server</span><br></pre></td></tr></table></figure></li>
</ul>
<ol start="2">
<li>MySQL数据库设置</li>
</ol>
<ul>
<li> 首先启动MySQL<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">systemctl start mysqld.service</span><br></pre></td></tr></table></figure></li>
<li>查看MySQL运行状态<br>出现<code>Active: active(runing)</code>则表示启动成功<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">systemctl status mysqld.service</span><br></pre></td></tr></table></figure></li>
<li>此时已运行成功并进入MySQL,执行以下命令找到密码<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">grep "password" /var/log/mysqld.log</span><br></pre></td></tr></table></figure></li>
<li>进入数据库<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mysql -uroot -p</span><br></pre></td></tr></table></figure></li>
<li>在数据库中修改密码,下面的<code>new password</code>填写新密码(密码设置格式为大小写、字符等)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';</span><br></pre></td></tr></table></figure></li>
<li>由于安装了yum repository,以后每次yum操作都会自动更新,需要把这个卸载掉<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum -y remove mysql57-community-release-el7-10.noarch</span><br></pre></td></tr></table></figure>
<h3 id="安装PHP"><a href="#安装PHP" class="headerlink" title="安装PHP"></a>安装PHP</h3></li>
</ul>
<hr>
<ol>
<li>如果之前已经安装先卸载之前的<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum -y remove php*</span><br></pre></td></tr></table></figure></li>
<li>由于linux的yum源不存在php7.x,所以我们要更改yum源<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm </span><br><span class="line">rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm</span><br></pre></td></tr></table></figure></li>
<li>安装php扩展,选择自己需要的<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml</span><br></pre></td></tr></table></figure></li>
<li>检验是否安装成功<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">php -V</span><br></pre></td></tr></table></figure></li>
<li>开启服务<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">systemctl start nginx.service</span><br><span class="line">systemctl start mysqlb.service</span><br><span class="line">systemctl start php-fpm.service</span><br></pre></td></tr></table></figure>
<h3 id="安装WordPress"><a href="#安装WordPress" class="headerlink" title="安装WordPress"></a>安装WordPress</h3></li>
<li>移除/usr/share/nginx/html内所有文件<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /usr/share/nginx/html</span><br><span class="line">rm 50x.html index.html</span><br></pre></td></tr></table></figure></li>
<li>下载并解压wordpress安装包<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://cn.wordpress.org/wordpress-5.0.2-zh_CN.zip</span><br><span class="line">tar -zxvf wordpress-5.0.2-zh_CN.zip</span><br></pre></td></tr></table></figure>
<h3 id="FAQ"><a href="#FAQ" class="headerlink" title="FAQ"></a>FAQ</h3></li>
</ol>
<hr>
<ol>
<li>远程连接MySQL出现1130错误,无法远程连接:error 1130: host ‘192.168.1.3’ is not allowed to connect to this MySQL<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mysql> use mysql</span><br><span class="line">mysql> select host, user from user;</span><br></pre></td></tr></table></figure></li>
</ol>
<ul>
<li>将相应用户数据表中的host字段改成’%’;<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">update user set host='%' where user='root';</span><br></pre></td></tr></table></figure></li>
<li>刷新保存,重新连接即可<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">flush privileges;</span><br></pre></td></tr></table></figure></li>
</ul>
]]></content>
<categories>
<category>技术教程</category>
</categories>
<tags>
<tag>linux</tag>
<tag>centos</tag>
<tag>wordpress</tag>
</tags>
</entry>
<entry>
<title>Linux 相关命令</title>
<url>/2018-11-07-linux/</url>
<content><![CDATA[<h2 id="查看CPU信息(型号)"><a href="#查看CPU信息(型号)" class="headerlink" title="查看CPU信息(型号)"></a>查看CPU信息(型号)</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c</span><br></pre></td></tr></table></figure>
<span id="more"></span>]]></content>
<categories>
<category>Linux相关</category>
</categories>
<tags>
<tag>linux</tag>
</tags>
</entry>
<entry>
<title>【Hyperledger第一讲】HyperLedger Fabric基础介绍和架构原理</title>
<url>/2018-12-01-fabric-basic-intro1/</url>
<content><![CDATA[<h2 id="简单概述"><a href="#简单概述" class="headerlink" title="简单概述"></a><strong>简单概述</strong></h2><hr>
<p>Hyperledger Fabric是由IBM公司主导开发的一个面向企业级客户的开源项目。与比特币和以太坊这类公有链不同,Hyperledger Fabric网络中的节点必须经过授权认证后才能加入,从而避免了POW资源开销,大幅提高了交易处理效率,满足企业级应用对处理性能的诉求。同时,为了满足灵活多变的应用场景,Hyperledger Fabric采用了高度模块化的系统设计理念,将权限认证模块(MSP)、共识服务模块(Ordering Service)、背书模块(Endorsing peers)、区块提交模块(committing peers)等进行分离部署,使开发者可以根据具体的业务场景替换模块,实现了模块的插件式管理(plug-in/plug-out)。所以,Hyperledger Fabric是一个私有链/联盟链的开发框架,而且系统的运行不需要token支持。</p>
<span id="more"></span>
<h2 id="关键组件"><a href="#关键组件" class="headerlink" title="关键组件"></a><strong>关键组件</strong></h2><hr>
<ol>
<li><p>Ledger:账本,节点维护的区块链和状态数据库</p>
</li>
<li><p>World state:世界状态,经过数次交易后最新的键值对</p>
</li>
<li><p>Channel: 通道,私有的子网络,通道中的节点共同维护账本,实现数据的隔离和保密。 每个channel对应一个账本,由加入该channel的peer维护,一个peer可以加入多个channel,维护多个账本。</p>
</li>
<li><p>Network:交易处理节点之间的P2P网络,用于维持区块链账本的一致性。</p>
</li>
<li><p>Org:Orginazation,管理一系列成员的组织。一个channel内可以有多个组织。</p>
</li>
<li><p>Chainnode:链码,运行在节点内的程序,目前支持Go、Nodejs、Java,运行在隔离的容器中,提供业务逻辑接口,对账本进行查询或更新</p>
</li>
<li><p>Endorse:背书阶段,指一个节点执行了一个交易并对结果进行签名后返回响应的过程(负责校验某个交易是否合法)。</p>
</li>
<li><p>Ordering Service:排序服务,将交易排序后放入区块中,并广播给网络各节点</p>
</li>
<li><p>PKI:Public Key Infrastructure,一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范</p>
</li>
<li><p>MSP:Membership Service Provider,成员管理服务,基于PKI实现,为网络成员生成证书,并管理身份</p>
</li>
</ol>
<h2 id="共识算法"><a href="#共识算法" class="headerlink" title="共识算法"></a><strong>共识算法</strong></h2><hr>
<p>在所有peers中,交易信息必须按照一致的顺序写入账本(区块链的基本原则)。例如,比特币通过POW机制,由最先完成数学难题的节点决定本次区块中的信息顺序,并广播给全网所有节点,以此来达成账本的共识。而Hyperledger Fabric采用了更加灵活、高效的共识算法,以适应企业场景下,对高TPS的要求。目前,Hyperledger Fabric有三种交易排序算法可以选择。</p>
<p>Solo:只有一个order服务节点负责接收交易信息并排序,这是最简单的一种排序算法,一般用在实验室测试环境中。Sole属于中心化的处理方式。</p>
<p>Kafka:是Apache的一个开源项目,主要提供分布式的消息处理/分发服务,每个kafka集群由多个服务节点组成。Hyperledger Fabric利用kafka对交易信息进行排序处理,提供高吞吐、低延时的处理能力,并且在集群内部支持节点故障容错。</p>
<p>SBFT:简单拜占庭算法,相比于kafka,提供更加可靠的排序算法,包括容忍节点故障以及一定数量的恶意节点。目前,Hyperledger Fabric社区正在开发该算法。</p>
<h2 id="节点架构"><a href="#节点架构" class="headerlink" title="节点架构"></a><strong>节点架构</strong></h2><hr>
<p>Fabric的节点具有不同身份并提供不同职能,下面是网络节点的示意图。</p>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-b4688b29c507f2dc.png" alt="网络节点的示意图"></p>
<p>一、Peer节点</p>
<ol>
<li><p>记账节点(Committing peer):所有的Peer节点都是记账 (committer) 节点,负责验证从排序服务接收到区块中的交易,维护账本的副本。</p>
</li>
<li><p>背书节点(Endoring peer):部分Peer节点会执行交易并对结果签名背书,充当背书 (Endorsement) 节点。背书节点是动态的角色,只有在应用<br>程序向它发起背书请求的时候才是背书节点,其他时候只是普通的记账节点,只负责验证交易并记账。Peers节点是一个逻辑的概念,endorser和committer可以同时部署在一台物理机上。</p>
</li>
<li><p>主节点(Leader Peer):代表的是与排序节点通信的节点,负责从排序服务节点处获取最新的区块并在组织内部同步。</p>
</li>
</ol>
<p>二、Orderer节点</p>
<ol>
<li><p>排序服务节点接收包含背书签名的交易,并进行排序、打包生成区块,广播给Peer节点,保证同一个链上的节点接收到相同的消息,并且有相同的逻辑顺序。</p>
</li>
<li><p>排序服务可以支持多链的交易处理,实现了多通道的数据隔离,保证只有同一个链的peer才能访问链上的数据。</p>
</li>
<li><p>排序服务可选择集中式(Solo)或分布式(Kafka)协议,其中Kafka集群可以实现崩溃故障容错(CFT)。</p>
</li>
</ol>
<p>三、CA节点</p>
<ol>
<li><p>CA节点是Fabric的证书颁发机构(Certificate Authority)。</p>
</li>
<li><p>CA节点接收客户端的注册申请,返回注册密码用于用户登陆,以便获取身份证书。</p>
</li>
<li><p>在区块链网络上所有的操作都会验证用户的身份。</p>
</li>
</ol>
<p>四、Client节点</p>
<ol>
<li><p>客户端节点代表最终用户操作的实体,它必须连接到某一个Peer节点或者排序服务节点上与区块链网络进行通信。</p>
</li>
<li><p>客户端节点向背书节点提交交易提案,收集到足够背书后,向排序服务广播交易,进行排序,生成区块。</p>
</li>
</ol>
<h2 id="数据存储"><a href="#数据存储" class="headerlink" title="数据存储"></a><strong>数据存储</strong></h2><hr>
<p>Fabric区块链系统的数据存储主要由一项文件存储(区块数据)和三项数据库组成,结构如下图。</p>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-4634a6f72e40172a.png" alt="数据存储结构"></p>
<p>一、区块数据</p>
<ol>
<li><p>区块(block)数据时以二进制文件的形式存储的,每个账本数据存储在节点文件系统的不同目录下</p>
</li>
<li><p>区块数据存储是通过区块文件管理器(blockfileMgr)实现的,它来决定区块存储于哪个目录下的哪个文件</p>
</li>
<li><p>区块文件管理器创建的文件名以“blockifle_”为前缀,6位数字位后缀,比如blockfile_000000,默认的区块文件大小为64MB,如果当前文件大小超过该值,则区块写入下一个文件中。</p>
</li>
</ol>
<p>二、区块索引</p>
<ol>
<li>Fabric提供多种索引方式,以方便能快速找到所需要区块数据。每次提交区块后都会更新索引数据库。索引方式(键)有:</li>
</ol>
<ul>
<li>区块编号 (Block Number)</li>
<li>区块哈希 (Block Hash)</li>
<li>交易编号 (Tx ID)</li>
</ul>
<ol start="2">
<li>索引的内容(值)是文件位置指针(File Location Pointer),结构如下:</li>
</ol>
<ul>
<li>fileSuffixNum:所在文件的编号</li>
<li>offset:文件内的偏移量</li>
<li>bytesLength:内容占用的字节数</li>
</ul>
<p>三、状态数据库</p>
<ol>
<li><p>状态数据(State Database)记录的是交易执行的结果,最新的状态代表了通道上所有键的最新值,所以又称为“世界状态”。</p>
</li>
<li><p>交易或查询操作调用链码会根据当前状态数据库来完成。</p>
</li>
<li><p>状态数据库支持查询单个键的数据,多个键的数据以及一个范围内的数据,如果使用的是CouchDB,还可以支持复杂的条件查询。</p>
</li>
</ol>
<p>四、历史数据</p>
<p>历史数据(History Database):记录的是每个状态数据的历史信息,每个历史信息以一个四元祖表示:</p>
<ul>
<li>namespace: 代表不同的chaincodeID</li>
<li>writeKey:要写入数据的键</li>
<li>blockNo:要写入数据所在的区块编号</li>
<li>tranNo:要写入数据所在区块内的交易编号</li>
</ul>
<h2 id="交易流程"><a href="#交易流程" class="headerlink" title="交易流程"></a><strong>交易流程</strong></h2><hr>
<p>以下是Fabric的经典交易流程,所有涉及到对账本数据更新的操作都是基于这个交易流程来完成的。</p>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-02de9417949c25e3.png" alt="交易流程图"></p>
<ol>
<li>发送交易提案<br>客户端通过SDK接口,向背书节点(endorsing peer)发送交易提案(Proposal),提案中包含交易所需参数。</li>
</ol>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-10e5adf2246f4b38.png" alt="发送交易提案"></p>
<ol start="2">
<li>模拟执行交易提案<br>每个endorsing peer节点模拟处理交易,此时并不会将交易信息写入账本。然后,endorser peer会验证交易信息的合法性,并对交易信息签名后,返回给client。此时的交易信息只是在client和单个endorser peer之间达成共识,并没有完成全网共识,各个client的交易顺序没有确定,可能存在双花问题,所以还不能算是一个“有效的交易”。同时,client需要收到“大多数”endorser peer的验证回复后,才算验证成功,具体的背书策略由智能合约代码控制,可以由开发者自由配置。</li>
</ol>
<p>每个执行都会产生对状态数据读出和写入的数据集合,叫做读写集(RWsets),读写集是交易中记录的主要内容</p>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-25369980dbb83ddf.png" alt="模拟执行交易提案"></p>
<ol start="3">
<li><p>返回提案响应<br>背书节点会对读写集进行背书(Endorse)签名,生成提案响应(Proposal response)并返回给应用程序</p>
</li>
<li><p>交易排序<br>client将签名后的交易信息发送给order service集群进行交易排序和打包。Order service集群通过共识算法,对所有交易信息进行排序,然后打包成区块。Order service的共识算法是以组件化形态插入Hyperledger系统的,也就是说开发者可以自由选择合适的共识算法。</p>
</li>
</ol>
<p>背书节点会对读写集进行背书(Endorse)签名,生成提案响应(Proposal response)并返回给应用程序</p>
<ol start="5">
<li>交易验证并提交<br>ordering service将排序打包后的区块广播发送给committing peers,由其做最后的交易验证,并写入区块链。ordering service只是决定交易处理的顺序,并不对交易的合法性进行校验,也不负责维护账本信息。只有committing peers才有账本写入权限。<br>应用程序根据接收到的提案响应生成交易,并发送给排序服务节点。排序服务打包一组交易到一个区块后,分发给各记账节点。</li>
</ol>
<p>每个节点会对区块中的所有交易进行验证,包括验证背书策略以及版本冲突验证(防止双花),验证不通过的交易会被标记会无效(Invalid)</p>
<p>账本更新:节点将读写集更新到状态数据库 ,将区块提交到区块链上</p>
<ol start="6">
<li>通知交易结果给客户端<br>各记账节点通知应用程序交易的成功与否,交易完成。</li>
</ol>
<h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a><strong>参考文档</strong></h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">http://www.hulupan.com/qukuailian/blockchain2183.html</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>Hyperledger</category>
</categories>
<tags>
<tag>blockchain</tag>
<tag>hyperledger</tag>
</tags>
</entry>
<entry>
<title>【Hyperledger第二讲】Ubuntu 16.04部署HyperLedger Fabric1.0并成功运行e2e-cli</title>
<url>/2018-12-02-fabric-ubuntu-deploy2/</url>
<content><![CDATA[<h2 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a><strong>准备环境</strong></h2><blockquote>
<p>操作系统:阿里云Ubuntu16.04<br>Git、Golang<br>Docker环境支持:docker、docker-compose<br>Fabric组件Docker镜像<br>Fabric源码库</p>
</blockquote>
<span id="more"></span>
<h2 id="安装步骤"><a href="#安装步骤" class="headerlink" title="安装步骤"></a><strong>安装步骤</strong></h2><p><strong>更新系统源</strong></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo apt-get update</span><br></pre></td></tr></table></figure>
<h3 id="安装Git"><a href="#安装Git" class="headerlink" title="安装Git"></a><strong>安装Git</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo apt install git</span><br></pre></td></tr></table></figure>
<ul>
<li> 查看git版本信息</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git version</span><br></pre></td></tr></table></figure>
<h3 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a><strong>安装Docker</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">参考文档:</span><br><span class="line">https://docs.docker.com/install/linux/docker-ce/ubuntu/</span><br><span class="line">https://yq.aliyun.com/articles/110806</span><br></pre></td></tr></table></figure>
<ul>
<li> 自动安装</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun</span><br></pre></td></tr></table></figure>
<ul>
<li> 查看docker版本</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker version</span><br></pre></td></tr></table></figure>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-cca35bb656ec72b2.jpg" alt="image"></p>
<ul>
<li> 设置阿里云docker镜像加速器</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">网址:https://cr.console.aliyun.com/mirrors</span><br></pre></td></tr></table></figure>
<h3 id="安装Docker-compose"><a href="#安装Docker-compose" class="headerlink" title="安装Docker-compose"></a><strong>安装Docker-compose</strong></h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">参考文档:</span><br><span class="line">https://docs.docker.com/compose/install/</span><br><span class="line">最新版地址:</span><br><span class="line">https://github.com/docker/compose/releases/</span><br></pre></td></tr></table></figure>
<ul>
<li> (官方途径)下载docker-compose,也可访问:<a href="http://link.zhihu.com/?target=https://get.daocloud.io/">https://get.daocloud.io</a>国内高速下载</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose</span><br></pre></td></tr></table></figure>
<ul>
<li> 授权</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo chmod +x /usr/local/bin/docker-compose</span><br></pre></td></tr></table></figure>
<ul>
<li> 查看版本信息</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker-compose --version</span><br></pre></td></tr></table></figure>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-596232dbcc9460e9.jpg" alt="image"></p>
<ul>
<li><p> 创建docker用户组</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo groupadd docker</span><br></pre></td></tr></table></figure></li>
<li><p> 将当前用户添加到用户组(${USER}为自己当前的用户名)</p>
</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo usermod -aG docker ${USER}</span><br></pre></td></tr></table></figure>
<ul>
<li> 重启docker</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo systemctl restart docker</span><br></pre></td></tr></table></figure>
<ul>
<li> 切换或者退出当前账户再重新登入</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">su root #切换到root用户</span><br><span class="line">su ${USER} #再切换到原来的应用用户以上配置才生效</span><br></pre></td></tr></table></figure>
<h3 id="安装Golang"><a href="#安装Golang" class="headerlink" title="安装Golang"></a><strong>安装Golang</strong></h3><ul>
<li> 访问国内此网站下载最新Linux稳定版的golang</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">中文社区网址:https://studygolang.com/dl</span><br><span class="line">获取安装包:wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz</span><br></pre></td></tr></table></figure>
<ul>
<li><p> 使用tar命令把安装包解压缩/usr/local文件夹下面</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -zxvf go1.11.linux-amd64.tar.gz -C /usr/local</span><br></pre></td></tr></table></figure></li>
<li><p> 设置环境变量</p>
</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo vim /etc/profile</span><br></pre></td></tr></table></figure>
<ul>
<li> 添加内容,其中go的安装目录是/usr/local/go,go的工作目录是/home/go</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export GOPATH=/home/go</span><br><span class="line">export GOROOT=/usr/local/go</span><br><span class="line">export PATH=$GOROOT/bin:$PATH</span><br></pre></td></tr></table></figure>
<ul>
<li> 使用source命令,使其配置信息生效</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure>
<ul>
<li> 查看go的版本信息</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go version</span><br></pre></td></tr></table></figure>
<ul>
<li> 查看go的具体配置信息</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go env</span><br></pre></td></tr></table></figure>
<ul>
<li> 在GOPATH目录下创建go目录</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir go</span><br></pre></td></tr></table></figure>
<ul>
<li> 进入go项目路径</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /home/go</span><br></pre></td></tr></table></figure>
<h2 id="Fabric部署"><a href="#Fabric部署" class="headerlink" title="Fabric部署"></a><strong>Fabric部署</strong></h2><ul>
<li> 在/home/go下创建目录</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir -p src/github.com/hyperledger</span><br><span class="line">cd src/github.com/hyperledger</span><br><span class="line">git clone https://github.com/hyperledger/fabric.git</span><br></pre></td></tr></table></figure>
<ul>
<li> 进入 fabric 目录查看版本分支并切换分支</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd fabric</span><br><span class="line">git branch</span><br><span class="line">此处选择对应版本或公开发行版,我选择v1.0.0</span><br><span class="line">git checkout v1.0.0</span><br></pre></td></tr></table></figure>
<ul>
<li> 下载fabric示例</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git clone -b master https://github.com/hyperledger/fabric-samples.git</span><br><span class="line">cd fabric-samples</span><br></pre></td></tr></table></figure>
<ul>
<li> 进入 fabric-samples 目录查看版本分支并切换分支</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd fabric-samples</span><br><span class="line">git branch</span><br><span class="line">此处选择对应版本或公开发行版,我选择v1.0.0</span><br><span class="line">git checkout v1.0.0</span><br></pre></td></tr></table></figure>
<p><strong>Fabric的Docker镜像下载</strong></p>
<ul>
<li> 进入<code>fabrci/examples/e2e_cli/</code>目录,完成镜像下载,执行命令:</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd /home/go/src/github.com/hyperledger/fabrci/examples/e2e_cli/</span><br><span class="line">ls</span><br></pre></td></tr></table></figure>
<ul>
<li> ls之后显示,在官网找对应的docker镜像版本号(<a href="http://link.zhihu.com/?target=https://hub.docker.com/u/hyperledger">https://hub.docker.com/u/hyperledger</a>),因为安装的fabric1.0.0,故我找的是1.0.0,这一步十分重要</li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-0a2ba8815895b61e.jpg" alt="image"></p>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-c575cb530dd7752e.jpg" alt="image"></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source download-dockerimages.sh -c {tags:输版本号} -f {tags:输版本号}</span><br><span class="line">source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0</span><br><span class="line">docker images</span><br></pre></td></tr></table></figure>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-434668a920ccc3e5.jpg" alt="image"></p>
<p><strong>启动Fabric并自动完成chaincode测试</strong></p>
<ul>
<li> 进入刚刚的e2e_cli文件目录,执行</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./network_setup.sh up</span><br></pre></td></tr></table></figure>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-299d82437a79b55a.jpg" alt="image"></p>
<p>显示END-E2E表示测试成功</p>
<p><strong>官方通过chaincode手动测试Fabric案例</strong></p>
<ul>
<li> 重新打开一个窗口,在fabric目录下输入</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker exec -it cli bash</span><br></pre></td></tr></table></figure>
<p><img src="http://upload-images.jianshu.io/upload_images/5946072-57cf73dc7ec190f9.jpg" alt="image"></p>
<ul>
<li> 再输入</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'</span><br></pre></td></tr></table></figure>
<ul>
<li> 图例显示a结果90</li>
<li> a给b转账50</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","50"]}'</span><br></pre></td></tr></table></figure>
<ul>
<li> 再执行查询语句,此时结果为40</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'</span><br></pre></td></tr></table></figure>
<ul>
<li> 最后,如果打算退出网络,先执行</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">exit</span><br></pre></td></tr></table></figure>
<ul>
<li> 在刚才fabric/examples/e2e_cli目录下执行</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./network_setup.sh down</span><br></pre></td></tr></table></figure>
<h2 id="安装Fabric-SDK-Go"><a href="#安装Fabric-SDK-Go" class="headerlink" title="安装Fabric SDK Go"></a><strong>安装Fabric SDK Go</strong></h2><blockquote>
<p>安装SDK</p>
</blockquote>
<ul>
<li> 下载软件包</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go get -u github.com/hyperledger/fabric-sdk-go</span><br></pre></td></tr></table></figure>
<ul>
<li> 安装依赖包</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd $GOPATH/src/github.com/hyperledger/fabric-sdk-go/</span><br><span class="line">chmod +x test/scripts/*.sh # make depend-install操作会调用dependencies.sh脚本</span><br><span class="line">make depend</span><br></pre></td></tr></table></figure>
<hr>
<p><strong>FAQ</strong></p>
<p>1、阿里云服务器,Ubuntu 报错 sudo: unable to resolve host</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">解决方案:https://blog.csdn.net/hhtnan/article/details/79551969</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">参考文档</span><br><span class="line">https://blog.csdn.net/cao0507/article/details/82080924</span><br><span class="line">https://docs.docker.com/install/linux/docker-ce/ubuntu/</span><br><span class="line">https://yq.aliyun.com/articles/110806</span><br><span class="line">https://github.com/docker/compose/releases/</span><br><span class="line">https://docs.docker.com/compose/install/</span><br><span class="line">https://github.com/hyperledger/fabric-sdk-go</span><br><span class="line">https://hub.docker.com/u/hyperledger</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>Hyperledger</category>
</categories>
<tags>
<tag>blockchain</tag>
<tag>hyperledger</tag>
</tags>
</entry>
<entry>
<title>【Hyperledger第三讲】Hyperledger Fabric1.x运行first-network和fabcar以及常见问题解决(持续更新)</title>
<url>/2018-12-03-fabric-firstnetwork-fabcar3/</url>
<content><![CDATA[<h2 id="基础环境搭建"><a href="#基础环境搭建" class="headerlink" title="基础环境搭建"></a>基础环境搭建</h2><hr>
<blockquote>
<p>操作系统:阿里云Ubuntu16.04<br>Git、Golang、Nodejs<br>Docker环境支持:docker、docker-compose<br>Fabric组件Docker镜像<br>fabric-samples源码库<br>Nodejs: 8.9.4</p>
</blockquote>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#先看这个搭建Hyperledger Fabric基础环境</span><br><span class="line">https://blog.csdn.net/holechain/article/details/88795776</span><br><span class="line">#(看到安装docker-compose完成即可,接下来看此篇)</span><br></pre></td></tr></table></figure>
<span id="more"></span>
<h2 id="安装Node-js"><a href="#安装Node-js" class="headerlink" title="安装Node.js"></a>安装Node.js</h2><hr>
<h3 id="1-首先,使用下面的命令来安装-nvm(第一种方式,两种选其一即可)"><a href="#1-首先,使用下面的命令来安装-nvm(第一种方式,两种选其一即可)" class="headerlink" title="1. 首先,使用下面的命令来安装 nvm(第一种方式,两种选其一即可)"></a>1. 首先,使用下面的命令来安装 nvm(第一种方式,两种选其一即可)</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash</span><br></pre></td></tr></table></figure>
<ul>
<li>下载并安装完成后用户退出重新登录或者重新 source 一下环境变量<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source ~/.bashrc</span><br></pre></td></tr></table></figure></li>
<li>查看当前的版本<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nvm ls</span><br></pre></td></tr></table></figure></li>
<li>首次安装没有版本,使用<code>nvm install </code>安装指定版本的 node<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nvm install v8.9.4</span><br></pre></td></tr></table></figure></li>
<li>再次查看 node 版本信息<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nvm list</span><br></pre></td></tr></table></figure></li>
<li>博主之前已经安装<code>v6.9.5</code>,目前<code>-></code>所指是<code>v6.9.5</code>版本,需要切换成<code>v8.9.4</code>版本<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nvm use v8.9.4</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/0a2c89f2bc8346e083b63fb2ea2bb227" alt="查看 node 版本信息和切换node版本"><h3 id="2-手动安装Node-js(第二种方式)"><a href="#2-手动安装Node-js(第二种方式)" class="headerlink" title="2. 手动安装Node.js(第二种方式)"></a>2. 手动安装Node.js(第二种方式)</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget wget https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.gz</span><br><span class="line">tar -zxvf node-v8.9.4-linux-x64.tar.gz</span><br><span class="line">sudo mv node-v8.9.4-linux-x64 /usr/local/node</span><br><span class="line">sudo ln -s /usr/local/node/bin/node /usr/local/bin/node</span><br><span class="line">sudo ln -s /usr/local/node/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm</span><br></pre></td></tr></table></figure>
<h3 id="3-测试是否安装成功,以及Node-js并设置镜像加速"><a href="#3-测试是否安装成功,以及Node-js并设置镜像加速" class="headerlink" title="3. 测试是否安装成功,以及Node.js并设置镜像加速"></a>3. 测试是否安装成功,以及<code>Node.js</code>并设置镜像加速</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node -v</span><br><span class="line">npm -v</span><br><span class="line">npm config set registry https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure>
<h2 id="构建网络"><a href="#构建网络" class="headerlink" title="构建网络"></a>构建网络</h2></li>
</ul>
<hr>
<ul>
<li>创建<code>fabric-samples</code>目录<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir -p github.com/hyperledger/fabric-samples</span><br></pre></td></tr></table></figure></li>
<li>进入<code>fabric-samples</code>下<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git clone https://github.com/hyperledger/fabric-samples.git</span><br></pre></td></tr></table></figure></li>
<li>查看版本分支<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git tag</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/1331a19f7d804e62910fd2ca5ade9662" alt="查看版本分支"></li>
<li>切换项目版本<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git checkout release1.0</span><br></pre></td></tr></table></figure></li>
<li>查看当前项目的版本<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch</span><br></pre></td></tr></table></figure></li>
<li>如果你要删除已命名的分支,执行下方代码<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git branch -d release1.0</span><br></pre></td></tr></table></figure></li>
<li>打开下方网址(下载<code>fabric-samples</code>目录下<code>bin</code>目录中所需要的文件)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric</span><br></pre></td></tr></table></figure></li>
<li>下载<code>hyperledger-fabric-linux-amd64-1.0.5.tar.gz</code>压缩包<br><img src="http://p1.pstatp.com/large/pgc-image/6214f3d1303b4ac8a09ef770175ecbeb" alt="下载Linux对应压缩包"><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.0.5/hyperledger-fabric-linux-amd64-1.0.5.tar.gz</span><br></pre></td></tr></table></figure></li>
<li>解压到<code>fabric-samples</code>目录下<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tar -zxvf hyperledger-fabric-linux-amd64-1.0.5.tar.gz -C /home/go/src/github.com/hyperledger/fabric-samples</span><br></pre></td></tr></table></figure></li>
</ul>
<p><em><strong>第一种方式:</strong></em><br>start</p>
<ul>
<li>下载<code>dockerimages</code>执行文件复制并在<code>fabric-samples</code>中创建bootstrap.sh<br><img src="http://p1.pstatp.com/large/pgc-image/212977dd9df94b388ce606c5757f8737" alt="执行init.sh文件"></li>
<li>在浏览器打开下方网站,复制该文件的内容到init.sh中(目的是下载fabric所需要的docker镜像)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://raw.githubusercontent.com/hyperledger/fabric/v1.0.5/scripts/bootstrap.sh </span><br></pre></td></tr></table></figure></li>
<li>复制好之后,bootstrap.sh保存<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim bootstrap.sh</span><br></pre></td></tr></table></figure></li>
<li>赋予权限<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">chmod -R 777 bootstrap.sh</span><br></pre></td></tr></table></figure></li>
<li>运行文件(<code>1.0.5</code>是指定fabric的docker镜像版本)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./bootstrap.sh 1.0.5</span><br></pre></td></tr></table></figure></li>
</ul>
<p><em><strong>第二种方式:</strong></em></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh</span><br><span class="line">cat bootstrap.sh | bash -s 1.0.5</span><br></pre></td></tr></table></figure>
<p><em><strong>第三种方式:(需要kx上网)</strong></em></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">curl -sSL https://goo.gl/6wtTN5 | sudo bash -s 1.0.5</span><br></pre></td></tr></table></figure>
<p>end</p>
<ul>
<li> 进入<code>first-network</code>目录中<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd first-network</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/212977dd9df94b388ce606c5757f8737" alt="是否已经构建,如果构建关闭重新构建"></li>
<li>目录分析<blockquote>
<ul>
<li>.env:存储一些环境变量</li>
<li>base:存储docker-compose的一些公共服务</li>
<li>byfn.sh:执行脚本</li>
<li>configtx.yaml和crypto-config.yaml:根据之前生成的2个工具,生成相应的配置文件,用来启动网络,放到当前目录的channel-artifacts和crypto-config里面</li>
<li>dockper-compose:用于启动网络</li>
<li>scripts:存放测试脚本,做的事:创建通道、加入通道,安装链码,实例化链码,链码交互</li>
</ul>
</blockquote>
</li>
<li>关闭网络,自动清除配置和docker进程<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./byfn.sh -m down</span><br></pre></td></tr></table></figure></li>
<li>执行以下命令构建网络<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./byfn.sh -m generate</span><br><span class="line">#./byfn.sh -m generate -i 1.1.0</span><br></pre></td></tr></table></figure></li>
</ul>
<h3 id="1-生成创世区块"><a href="#1-生成创世区块" class="headerlink" title="1. 生成创世区块"></a>1. 生成创世区块</h3><ul>
<li>指定按照yaml文件生成配置(<code>crypto-config.yaml</code>:用于配置组织节点的个数)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">../bin/cryptogen generate --config=./crypto-config.yaml</span><br></pre></td></tr></table></figure></li>
<li>在<code>first-network</code>目录下设置变量:(设置工作目录)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export FABRIC_CFG_PATH=$PWD</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/564f2bd840c7446ab83270f033d1385f" alt="设置变量并创建初始区块"></li>
<li>生成系统链的创世区块:(<code>-profile</code>指定联盟配置,<code>outputBlock</code>指定存放的位置,<code>genesis.block</code>指整个网络的创世区块)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block</span><br></pre></td></tr></table></figure>
<h3 id="2-生成应用通道的配置信息"><a href="#2-生成应用通道的配置信息" class="headerlink" title="2. 生成应用通道的配置信息"></a>2. 生成应用通道的配置信息</h3></li>
<li>生成通道的创世交易:<code>-profile</code>指定业务联盟,<code>-outputCreateChannelTx</code>指存放的路径,创建的名字叫<code>mychannel</code></li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export CHANNEL_NAME=mychannel</span><br><span class="line">../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channelID $CHANNEL_NAME</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/68d104a6e300406589e14d373dbf7a39" alt="生成应用通道的配置信息"></p>
<h3 id="3-生成锚节点配置更新文件"><a href="#3-生成锚节点配置更新文件" class="headerlink" title="3. 生成锚节点配置更新文件"></a>3. 生成锚节点配置更新文件</h3><ul>
<li>生成两个组织锚节点的交易信息<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP</span><br></pre></td></tr></table></figure>
<h2 id="操作网络"><a href="#操作网络" class="headerlink" title="操作网络"></a>操作网络</h2></li>
</ul>
<hr>
<p>编辑<code>docker-compose-cli.yaml</code>,注释<code>command</code>命令</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim docker-compose-cli.yaml</span><br></pre></td></tr></table></figure>
<p>运行<code>docker-compose-cli.yaml</code><br><img src="http://p1.pstatp.com/large/pgc-image/cd82e418313647eb844ba63de6dca17a" alt="image.png"></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d</span><br></pre></td></tr></table></figure>
<h3 id="1-创建和加入通道"><a href="#1-创建和加入通道" class="headerlink" title="1. 创建和加入通道"></a>1. 创建和加入通道</h3><ul>
<li><p>与客户端交互操作</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker exec -it cli bash</span><br></pre></td></tr></table></figure></li>
<li><p>创建通道(<code>-o</code>指定与哪个orderer节点通信,<code>-c</code>指定创建的通道名称,<code>-f</code>指定使用的文件)</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export CHANNEL_NAME=mychannel</span><br><span class="line">peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem</span><br></pre></td></tr></table></figure>
<p><img src="http://p1.pstatp.com/large/pgc-image/7bdfed4ff04c4def82c18291c8b818dd" alt="image.png"></p>
</li>
<li><p>查看orderer节点的运行日志</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker logs orderer.example.com</span><br></pre></td></tr></table></figure></li>
<li><p>加入通道</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer channel join -b mychannel.block</span><br></pre></td></tr></table></figure></li>
<li><p>查看peer加入的通道列表</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer channel list</span><br></pre></td></tr></table></figure>
<h3 id="2-安装并实例化链码"><a href="#2-安装并实例化链码" class="headerlink" title="2. 安装并实例化链码"></a>2. 安装并实例化链码</h3></li>
</ul>
<hr>
<ul>
<li>安装链码(<code>-n</code>指定链码安装的名字,<code>-v</code>指定version,<code>-l</code>指定使用语言,<code>-p</code>指定安装链码的所在路径)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02</span><br></pre></td></tr></table></figure></li>
<li>实例化链码<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode instantiate \</span><br><span class="line">-o orderer.example.com:7050 \</span><br><span class="line">--tls $CORE_PEER_TLS_ENABLED \</span><br><span class="line">--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \</span><br><span class="line">-C $CHANNEL_NAME \</span><br><span class="line">-n mycc \</span><br><span class="line">-v 1.0 \</span><br><span class="line">-c '{"Args":["init","a","100","b","200"]}' \</span><br><span class="line">-P "OR ('Org1MSP.member','Org2MSP.member')"</span><br></pre></td></tr></table></figure></li>
<li>查询<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/558236b06391421aae54e49fe9d7acac" alt="查询结果"></li>
<li>转账<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">peer chaincode invoke \</span><br><span class="line">-o orderer.example.com:7050 \</span><br><span class="line">--tls $CORE_PEER_TLS_ENABLED \</span><br><span class="line">--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \</span><br><span class="line">-C $CHANNEL_NAME \</span><br><span class="line">-n mycc \</span><br><span class="line">-c '{"Args":["invoke","a","b","10"]}'</span><br></pre></td></tr></table></figure>
点击<code>exit</code>退出<code>docker</code>容器<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./byfn.sh -m down</span><br></pre></td></tr></table></figure>
###参数说明:</li>
<li>-o:指定order服务节点地址</li>
<li>–tls:是否开启TLS验证</li>
<li>–cafile:指定TLS_CA证书的所在路径</li>
<li>-C:指定通道名称</li>
<li>-n:指定链码名称</li>
<li>-c:指定调用链码的所需参数</li>
<li>-p:指定安装链码的所在路径</li>
<li>-P:指定背书策略<br>#Node.js和fabcar交互</li>
</ul>
<hr>
<p>进入<code>fabric-samples</code>目录下的<code>fabcar</code>目录中</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd fabric-samples/fabcar</span><br></pre></td></tr></table></figure>
<p>查看<code>package.json</code>文件<br><img src="http://p1.pstatp.com/large/pgc-image/6b61b325d2c043b19ee736be236324bc" alt="查看`package.json`文件"></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cat package.json</span><br></pre></td></tr></table></figure>
<h2 id="Fabcar启动"><a href="#Fabcar启动" class="headerlink" title="Fabcar启动"></a>Fabcar启动</h2><hr>
<ul>
<li>进入first-network中执行<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./byfn.sh -m down</span><br></pre></td></tr></table></figure></li>
<li>关闭活跃容器<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker rm -f $(docker ps -a)</span><br></pre></td></tr></table></figure></li>
<li>清理缓存的网络<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker network prune</span><br></pre></td></tr></table></figure></li>
<li>删除fabcar智能合约的底层链码图像,如果是第一次运行这个项目可以不执行(可以通过 docker images来查询需要删除的镜像)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba</span><br></pre></td></tr></table></figure></li>
<li>在<code>fabcar</code>目录中安装客户端<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">npm install</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/54542927eb3c4ca8ae8e809a018a86e2" alt="npm install 中1"><br><img src="http://p1.pstatp.com/large/pgc-image/54542927eb3c4ca8ae8e809a018a86e2" alt="npm install 中2"></li>
<li>启动网络<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./startFabric.sh node</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/9559029fbff84d028fea1cf95e2dbd7a" alt="./startFabric.sh node"></li>
<li>执行完成后,注册管理用户(首先应用的admin用户应该向ca-server发送一个证书登记请求,接受一个对于这个user的登记证书(eCert),后续我们会根据使用这个admin注册和认证一个新的user)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node enrollAdmin.js</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/9559029fbff84d028fea1cf95e2dbd7a" alt="node encrollAdmin.js运行成功"></li>
<li>实现registerUser.js,生成用户账户(创建一个普通用户user1,这个用户用来查询和更新账本。admin用户身份用来创建user1用户)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node registerUser.js</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/8e7e27a0b538467aa85ca6a1f71a2f29" alt="node registerUser.js运行成功"></li>
<li>现在我们可以运行JavaScript程序。首先,运行query.js 程序,返回账本上所有汽车列表。应用程序中预先加载了一个queryAllCars函数,用于查询所有车辆,因此我们可以简单地运行程序:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node query.js</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/8279337eed6e41238d6a8020541825a3" alt="node query.js运行成功"></li>
<li>如果想返回某个车辆信息,编辑query.js,我们将函数<code>queryAllCars</code>更改为<code>queryCar</code>并将特定的“Key” 传递给args参数。在这里,我们使用<code>CAR4</code>。 所以我们编辑后的query.js程序现在应该包含以下内容:</li>
</ul>
<p><img src="http://p1.pstatp.com/large/pgc-image/8279337eed6e41238d6a8020541825a3" alt="编辑query.js"></p>
<ul>
<li>重新运行query.js<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">node query.js</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/4a072657521b4eba9272c1497fdc9875" alt="image.png"></li>
</ul>
<h2 id="FAQ"><a href="#FAQ" class="headerlink" title="FAQ"></a>FAQ</h2><hr>
<ol>
<li> 运行<code>./byfn.sh -m down</code>出现错误的解决方法:<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://segmentfault.com/a/1190000014221967</span><br></pre></td></tr></table></figure></li>
<li> 执行<code>node registerUser.js </code>出现错误:<code>Failed to register: Error: fabric-ca request register failed with errors [[{"code":0,"message":"No identity type provided. Please provide identity type"}]]</code><br><img src="http://p1.pstatp.com/large/pgc-image/3edeefe1819e48c29622f83a027829c8" alt="执行`node registerUser.js `出现错误"></li>
</ol>
<ul>
<li>大概的意思是需要我们提供一个可验证的type。 只需编辑 <code>node registerUser.js </code>文件<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vim registerUser.js</span><br></pre></td></tr></table></figure></li>
<li>把<code>returnfabric_ca_client.register({enrollmentID: 'user1', affiliation:'org1.department1'}, admin_user);</code>替换为下方代码<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">returnfabric_ca_client.register({enrollmentID: 'user1', affiliation:'org1.department1',role: 'client'}, admin_user);</span><br></pre></td></tr></table></figure>
<img src="http://p1.pstatp.com/large/pgc-image/615e91e3eb134b6fadeea55a5e49a1e6" alt=" node registerUser.js替换"></li>
<li>点击保存重新运行即可</li>
</ul>
<ol start="3">
<li>设置<code>marbles . step 4 error error: Caught exception: TypeError: Cannot read property 'getConnectivityState' of undefined</code>出错<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">npm uninstall grpc</span><br><span class="line">rm -rf node_modules/</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure></li>
<li><img src="http://p1.pstatp.com/large/pgc-image/430c83ad81004198bce8ef787e12d74d" alt="node registerUser.js"><br><img src="http://p1.pstatp.com/large/pgc-image/38c4162040b24bbbaeb398ac5be46c0a" alt="image.png"></li>
</ol>
<p><img src="http://p1.pstatp.com/large/pgc-image/dbf34b18c1a744a18b4df1fa8f57b500" alt="image.png"></p>
<h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><hr>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://github.com/IBM-Blockchain/marbles/blob/master/docs/use_local_hyperledger.md</span><br><span class="line">https://hyperledger-fabric.readthedocs.io/en/release-1.0/chaincode4noah.html</span><br><span class="line">https://hyperledger-fabric.readthedocs.io/en/release-1.0/write_first_app.html</span><br><span class="line">https://blog.csdn.net/qq_27348837/article/details/87362268</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>Hyperledger</category>
</categories>
<tags>
<tag>blockchain</tag>
<tag>hyperledger</tag>
</tags>
</entry>
<entry>
<title>Mac下安装与配置Go语言开发环境</title>
<url>/2018-12-13-mac-install-golang/</url>
<content><![CDATA[<p><img src="http://p1.pstatp.com/large/pgc-image/132340be8ea24014a7e191ea66ce96b0" alt="image.png"></p>
<ol>
<li>国内网站下载Mac版安装包<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://studygolang.com/dl</span><br></pre></td></tr></table></figure></li>
<li>配置GO环境变量GOPATH和GOBIN</li>
</ol>
<ul>
<li>打开Mac终端,编辑<code>.bash_profile</code>文件<span id="more"></span>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi ~/.bash_profile</span><br></pre></td></tr></table></figure></li>
<li>在<code>.bash_profile</code>文件中添加环境变量<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">export GOROOT=/usr/local/go</span><br><span class="line">#GOPATH是自己的go项目路径,自定义设置</span><br><span class="line">export GOPATH=/Users/nrgh/Documents/Go</span><br><span class="line">export GOBIN=$GOROOT/bin</span><br><span class="line">export PATH=$PATH:$GOBIN</span><br></pre></td></tr></table></figure></li>
<li>编译使其生效<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">source ~/.bash_profile</span><br></pre></td></tr></table></figure></li>
</ul>
<ol start="3">
<li>查看相关参数</li>
</ol>
<ul>
<li>查看Go版本<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go version</span><br></pre></td></tr></table></figure></li>
<li>查看Go环境变量<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">go env</span><br></pre></td></tr></table></figure></li>
</ul>
<ol start="4">
<li>编辑测试Demo</li>
</ol>
<ul>
<li> 在gopath目录中新建项目,名称自定义,然后新建测试文件并保存。<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">package main</span><br><span class="line"> </span><br><span class="line">import (</span><br><span class="line"> "fmt"</span><br><span class="line">)</span><br><span class="line"> </span><br><span class="line">func main() {</span><br><span class="line"> fmt.Println("hello");</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li>
<li>运行测试:在测试文件所在目录运行下方指令<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#编译并执行</span><br><span class="line">go build /Users/nrgh/Documents/Go/test/main.go</span><br><span class="line">#只看执行结果</span><br><span class="line">go run /Users/nrgh/Documents/Go/test/main.go</span><br></pre></td></tr></table></figure></li>
</ul>
]]></content>
<categories>
<category>技术教程</category>
</categories>
<tags>
<tag>golang</tag>
<tag>mac</tag>
</tags>
</entry>
<entry>
<title>【Hyperledger第四讲】Hyperledger Fabric SDK示例 fabric-samples-《balance-transfer》</title>
<url>/2018-12-18-fabric-balance-transfer4/</url>
<content><![CDATA[<h3 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h3><hr>
<p>hyperledger fabric运行网络、postman(测试API工具)、nodejs8.9.4</p>
<span id="more"></span>
<h3 id="目录结构分析"><a href="#目录结构分析" class="headerlink" title="目录结构分析"></a>目录结构分析</h3><hr>
<p><img src="https://upload-images.jianshu.io/upload_images/5946072-fd506d6f8e59ae4d.png" alt="balance-transfer目录结构分析"></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">├── app // 与fabric网络交互的实现</span><br><span class="line">│ ├── create-channel.js</span><br><span class="line">│ ├── helper.js</span><br><span class="line">│ ├── install-chaincode.js</span><br><span class="line">│ ├── instantiate-chaincode.js</span><br><span class="line">│ ├── invoke-transaction.js</span><br><span class="line">│ ├── join-channel.js</span><br><span class="line">│ ├── network-config-aws.json</span><br><span class="line">│ ├── network-config.json</span><br><span class="line">│ └── query.js</span><br><span class="line">├── app.js // 定义与fabric网络交互的API</span><br><span class="line">├── artifacts // 启动fabric网络需要的配置</span><br><span class="line">│ ├── base.yaml</span><br><span class="line">│ ├── channel</span><br><span class="line">│ ├── docker-compose.yaml</span><br><span class="line">│ └── src</span><br><span class="line">├── config.js</span><br><span class="line">├── config.json</span><br><span class="line">├── node_modules</span><br><span class="line">│ └── .......</span><br><span class="line">├── package.json</span><br><span class="line">├── package-lock.json</span><br><span class="line">├── README.md</span><br><span class="line">├── runApp.sh</span><br><span class="line">└── testAPIs.sh</span><br></pre></td></tr></table></figure>
<h3 id="运行示例"><a href="#运行示例" class="headerlink" title="运行示例"></a>运行示例</h3><hr>
<ol>
<li>下载示例<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">git clone https://github.com/hyperledger/fabric-samples.git</span><br><span class="line">cd fabric-samples</span><br></pre></td></tr></table></figure></li>
<li>启动脚本</li>
</ol>
<ul>
<li>进入到balance-transfer目录,运行runApp.sh脚本,fabric网络以及node服务都会运行起来<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd balance-transfer</span><br><span class="line">./runApp.sh</span><br></pre></td></tr></table></figure>
<img src="https://upload-images.jianshu.io/upload_images/5946072-5dc33da411ab616e.png" alt="./runApp.sh执行结果"></li>
</ul>
<ol start="3">
<li>测试脚本</li>
</ol>
<ul>
<li>在另一个终端运行testAPIs.sh测试脚本,使用API来操作fabric网络,它主要做了:<blockquote>
<ul>
<li>创建channel</li>
<li>安装chaincode</li>
<li>初始化chaincode</li>
<li>执行chaincode</li>
<li>各种查询</li>
</ul>
</blockquote>
</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./testAPIs.sh</span><br></pre></td></tr></table></figure>
<ul>
<li>运行结果(部分省略)<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">POST request Create channel ...</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Channel 'mychannel' created Successfully"}</span><br><span class="line"></span><br><span class="line">POST request Join channel on Org1</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Successfully joined peers in organization Org1 to the channel:mychannel"}</span><br><span class="line"></span><br><span class="line">POST request Join channel on Org2</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Successfully joined peers in organization Org2 to the channel:mychannel"}</span><br><span class="line"></span><br><span class="line">POST Install chaincode on Org1</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Successfully install chaincode"}</span><br><span class="line"></span><br><span class="line">POST Install chaincode on Org2</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Successfully install chaincode"}</span><br><span class="line"></span><br><span class="line">POST instantiate chaincode on peer1 of Org1</span><br><span class="line"></span><br><span class="line">{"success":true,"message":"Successfully instantiate chaingcode in organization Org1 to the channel 'mychannel'"}</span><br><span class="line"></span><br><span class="line">POST invoke chaincode on peers of Org1</span><br><span class="line"></span><br><span class="line">Transacton ID is 2eded4ef539d54b6822ba214788c5ae1515985d9c3628fdd259f5e0ab53582e5</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">GET query chaincode on peer1 of Org1</span><br><span class="line"></span><br><span class="line">a now has 90 after the move</span><br><span class="line"></span><br><span class="line">GET query Block by blockNumber</span><br><span class="line"></span><br><span class="line">GET query Transaction by TransactionID</span><br><span class="line"></span><br><span class="line">GET query ChainInfo</span><br><span class="line"></span><br><span class="line">GET query Installed chaincodes</span><br><span class="line"></span><br><span class="line">["name: mycc, version: v0, path: github.com/example_cc/go"]</span><br><span class="line"></span><br><span class="line">GET query Instantiated chaincodes</span><br><span class="line"></span><br><span class="line">["name: mycc, version: v0, path: github.com/example_cc/go"]</span><br><span class="line"></span><br><span class="line">GET query Channels</span><br><span class="line"></span><br><span class="line">{"channels":[{"channel_id":"mychannel"}]}</span><br><span class="line"></span><br><span class="line">Total execution time : 90 secs ...</span><br></pre></td></tr></table></figure></li>
</ul>
<h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a><strong>参考文档</strong></h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://blog.csdn.net/zhayujie5200/article/details/79684032</span><br><span class="line">https://blog.csdn.net/qq_27818541/article/details/78246947</span><br><span class="line">https://blog.csdn.net/weixin_41926234/article/details/80626078</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category>Hyperledger</category>
</categories>
<tags>
<tag>blockchain</tag>
<tag>hyperledger</tag>
</tags>
</entry>
<entry>
<title>【Hyperledger第五讲】Hyperledger Fabric Node SDK详解</title>
<url>/2018-12-25-fabric-nodesdk5/</url>
<content><![CDATA[<h3 id="Fabric-Node-SDK主要功能"><a href="#Fabric-Node-SDK主要功能" class="headerlink" title="Fabric Node SDK主要功能"></a>Fabric Node SDK主要功能</h3><hr>
<p>SDK for Node.js有三个最顶层(top-level)的模块:API, fabric-client 和 fabric-ca-client。具体细节见官方文档及源码。</p>
<span id="more"></span>
<ol>
<li><p>API<br>该模块给开发者提供了可插拔API,以提供SDK主要接口的可替换实现,包括CryptoSuite, key, KeyValueStore。每个接口都有内置的默认实现。</p>
</li>
<li><p>fabric-client<br>该模块提供了用户客户端与Fabric区块链网络组件(peer,orderer,event等)的交互。主要功能有:</p>
</li>
</ol>
<ul>
<li>创建channel</li>
<li>发送信息使peer节点加入channel</li>
<li>在peer中安装(install)chaincode</li>
<li>在channel上实例化 chaincode,分为两步:提案( propose )和交易(transact)</li>
<li>提交(submit)一个交易(需要调用chaincode),和上面一样分为两步</li>
<li>多种查询功能:状态(通过chaincode),交易,区块,channel,chaincode</li>
<li>监控事件(monitoring events):包括peer,block,transactions,custom的events</li>
<li>有签名能力的用户对象( User object)的序列化(serializable)</li>
<li>配置信息的分层(hierarchical configuration settings)</li>
<li>还提供可插拔(pluggable)的日志工具(logging utility)、加密工具(CryptoSuite)和状态存储方法(State Store),可以支持与 peer 或 orderer 的 TLS / non-TLS 链接</li>
</ul>
<ol start="3">
<li>fabric-ca-client<br>该模块主要用于成员资格的管理,主要功能如下:</li>
</ol>
<ul>
<li>注册(register )新用户</li>
<li>登录(enroll)用户并且获得由Fabric CA签名(CA私钥完成)的登录证书(enrollment certificate)</li>
<li>通过登录id(enrollment id)来注销 (revoke) 一个用户</li>
<li>可定制的(customizable)持久储存(persistence store)<h3 id="Fabric-Node-SDK具体接口"><a href="#Fabric-Node-SDK具体接口" class="headerlink" title="Fabric Node SDK具体接口"></a>Fabric Node SDK具体接口</h3></li>
</ul>
<hr>
<p>Node SDK主要的模块及其中重要的方法如下:</p>
<ol>
<li>Client</li>
</ol>
<ul>
<li>getUserContext() / setUserContext():从本地读取/写入用户信息</li>
<li>创建其他各种类的示例</li>
</ul>
<ol start="2">
<li>CAClient</li>
</ol>
<ul>
<li>register():登记</li>
<li>enroll():注册</li>
</ul>
<ol start="3">
<li>Channel</li>
</ol>
<ul>
<li>sendTransactionProposal():发送提案</li>
<li>sendTransaction():发送交易</li>
<li>queryByChaincode():调用链码查询</li>
<li>各种与区块、交易有关的查询功能</li>
</ul>
<ol start="4">
<li>Peer</li>
</ol>
<ul>
<li>sendProposal():发送交易提案到Peer节点</li>
</ul>
<ol start="5">
<li>Orderer</li>
</ol>
<ul>
<li>sendBrodcast():发送数据到Ordere节点</li>
<li>sendDeliver():从Orderer节点获取数据</li>
</ul>
<p><strong>参考文档</strong></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://fabric-sdk-node.github.io/release-1.4/index.html</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>Hyperledger</category>
</categories>
<tags>
<tag>blockchain</tag>
<tag>hyperledger</tag>
</tags>
</entry>
<entry>