-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1461 lines (980 loc) · 238 KB
/
index.html
File metadata and controls
1461 lines (980 loc) · 238 KB
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
<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="dns-prefetch" href="https://github.com/RookieLinLucy666/study.github.io">
<title>Blog of Yijing</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="Ph.D Student">
<meta property="og:type" content="website">
<meta property="og:title" content="Blog of Yijing">
<meta property="og:url" content="https://github.com/RookieLinLucy666/study.github.io/index.html">
<meta property="og:site_name" content="Blog of Yijing">
<meta property="og:description" content="Ph.D Student">
<meta property="og:locale" content="default">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Blog of Yijing">
<meta name="twitter:description" content="Ph.D Student">
<link rel="alternative" href="/atom.xml" title="Blog of Yijing" type="application/atom+xml">
<link rel="icon" href="/favicon.jpeg">
<link rel="stylesheet" type="text/css" href="/study.github.io/./main.0cf68a.css">
<style type="text/css">
#container.show {
background: linear-gradient(200deg,#a0cfe4,#e8c37e);
}
</style>
</head>
</html>
<body>
<div id="container" q-class="show:isCtnShow">
<canvas id="anm-canvas" class="anm-canvas"></canvas>
<div class="left-col" q-class="show:isShow">
<div class="overlay" style="background: #4d4d4d"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/study.github.io/" class="profilepic">
<img src="/study.github.io/assets/img/avatar.jpeg" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/study.github.io/">Yijing Lin</a></h1>
</hgroup>
<nav class="header-menu">
<ul>
<li><a href="/study.github.io/tags/2019/">2019</a></li>
<li><a href="/study.github.io/tags/2020/">2020</a></li>
<li><a href="/study.github.io/tags/2022/">2022</a></li>
<li><a href="/study.github.io/tags/research/">research</a></li>
</ul>
</nav>
<nav class="header-smart-menu">
<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
<a q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">友链</a>
<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/RookieLinLucy666" title="github"><i class="icon-github"></i></a>
<a class="google" target="_blank" href="/study.github.io/pawn0603@gmail.com" title="google"><i class="icon-google"></i></a>
</div>
</nav>
</header>
</div>
</div>
<div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
<nav id="mobile-nav">
<div class="overlay js-overlay" style="background: #4d4d4d"></div>
<div class="btnctn js-mobile-btnctn">
<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img src="/study.github.io/assets/img/avatar.jpeg" class="js-avatar">
</div>
<hgroup>
<h1 class="header-author js-header-author">Yijing Lin</h1>
</hgroup>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/RookieLinLucy666" title="github"><i class="icon-github"></i></a>
<a class="google" target="_blank" href="/study.github.io/pawn0603@gmail.com" title="google"><i class="icon-google"></i></a>
</div>
</nav>
<nav class="header-menu js-header-menu">
<ul style="width: 70%">
<li style="width: 25%"><a href="/study.github.io/tags/2019/">2019</a></li>
<li style="width: 25%"><a href="/study.github.io/tags/2020/">2020</a></li>
<li style="width: 25%"><a href="/study.github.io/tags/2022/">2022</a></li>
<li style="width: 25%"><a href="/study.github.io/tags/research/">research</a></li>
</ul>
</nav>
</header>
</div>
<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>
<div id="wrapper" class="body-wrap">
<div class="menu-l">
<div class="canvas-wrap">
<canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
</div>
<div id="js-content" class="content-ll">
<article id="post-arXiv" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/04/05/arXiv/">arXiv上传</a>
</h1>
<a href="/study.github.io/2022/04/05/arXiv/" class="archive-article-date">
<time datetime="2022-04-05T03:45:55.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-04-05</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<h1 id="arXiv上传指南"><a href="#arXiv上传指南" class="headerlink" title="arXiv上传指南"></a>arXiv上传指南</h1><h2 id="注册账号"><a href="#注册账号" class="headerlink" title="注册账号"></a>注册账号</h2><p>用edu邮箱注册并验证</p>
<h2 id="Start"><a href="#Start" class="headerlink" title="Start"></a>Start</h2><p>新建提交,START NEW SUBMISSION;</p>
<p>填写信息,Verify your contact information;</p>
<p>确认作者身份,I am submitting as an author of this article;</p>
<p>确认协议,选择CC BY或者其他的(根据需要);</p>
<h2 id="Add-Files"><a href="#Add-Files" class="headerlink" title="Add Files"></a>Add Files</h2><p>arXiv只接受word生成的PDF,tex文件生成的PDF需要上传source file。所以,博客Grok(<a href="http://lowrank.science/arXiv-LaTeX/)给出的解决方案如下:" target="_blank" rel="noopener">http://lowrank.science/arXiv-LaTeX/)给出的解决方案如下:</a></p>
<p>arXiv 支持所有东西一整个 zip 压缩包上传,上传后会自动解压,所以只需要把图片、bbl、tex 文件按如下方式组织即可。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── manuscript.tex</span><br><span class="line">├── ref.bbl</span><br><span class="line">├── figure</span><br><span class="line">| └── subfold1</span><br><span class="line">| └── subfold2</span><br></pre></td></tr></table></figure>
<p>注意,是 bbl 文件,不是 bib 文件,arXiv 不支持编译 bib,所以要上传本地编译好的 bbl 文件。</p>
<p>点击Upload file,出现File Uploaded。</p>
<h2 id="Process"><a href="#Process" class="headerlink" title="Process"></a>Process</h2><p>arXiv now processes new submissions …</p>
<p>可以查看生成的文件。</p>
<h2 id="Metadata"><a href="#Metadata" class="headerlink" title="Metadata"></a>Metadata</h2><p>输入Title, Author, Abstract后,点击proceed生成metadata。</p>
<h2 id="Preview"><a href="#Preview" class="headerlink" title="Preview"></a>Preview</h2><p>查看生成的文件,点击Submit提交完成。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">research</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/04/05/arXiv/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-Algorand" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/03/18/Algorand/">Algorand</a>
</h1>
<a href="/study.github.io/2022/03/18/Algorand/" class="archive-article-date">
<time datetime="2022-03-18T10:54:05.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-03-18</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<h1 id="Together-for-a-Shared-Future-Finance(一起向未来金融)"><a href="#Together-for-a-Shared-Future-Finance(一起向未来金融)" class="headerlink" title="Together for a Shared Future Finance(一起向未来金融)"></a>Together for a Shared Future Finance(一起向未来金融)</h1><h1 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h1><p>在数字经济时代下,区块链技术驱动金融行业的创新发展,通过基于区块链的未来金融基础设施可提供弱信任环境下的去中心化可信服务。然而,现有的区块链技术框架暂时无法适配数字经济范式中的性能、互通和合规性要求,难以直接链接区块链技术与传统金融行业。</p>
<p>Algorand通过突破区块链不可能三角、多链互通的框架以及合规化设计等技术优势以满足金融业复杂而精密的技术需求,致力于构建合规的金融区块链,以成为未来金融基础设施。</p>
<p>本文将从数字经济的背景出发,探讨区块链对未来金融的影响;随后分析Algorand的团队优势、技术优势和生态优势;进而结合全球监管合规政策分析对Algorand的可能影响以及应对策略;最后,从技术和应用两个角度给出Algorand构建未来金融基础设施的具体建议。</p>
<p><strong>关键词:</strong>区块链 未来金融 Algorand 监管合规</p>
<a class="article-more-a" href="/study.github.io/2022/03/18/Algorand/#more">more >></a>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">research</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/03/18/Algorand/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-2021-Summary" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/02/25/2021-Summary/">2021 Summary</a>
</h1>
<a href="/study.github.io/2022/02/25/2021-Summary/" class="archive-article-date">
<time datetime="2022-02-25T09:40:21.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-02-25</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<p>近期,观望学术新星的社交媒体有感,一个记录自己科研、学习、生活的博客很重要,遂捡起停更两年的博客,开启记录读博生涯以及踩过的坑。希望博客可以鞭策自己,成为优秀的人。但是,不优秀也没关系,开心是第一要义。</p>
<p>这一篇博客主要总结读博一年半(研究生入学两年半,硕博连读)的成果(截止2022年2月25日)。后续的好消息将在以下内容的基础上,进行部分更新。</p>
<h1 id="论文"><a href="#论文" class="headerlink" title="论文"></a>论文</h1><h2 id="一作论文"><a href="#一作论文" class="headerlink" title="一作论文"></a>一作论文</h2><ul>
<li>Dynamic Decentralized Collaboration Framework Based on Intelligent Sharding and Federated Learning (under review)</li>
<li>An Efficient and Decentralized Outsourcing Training Paradigm Based on Collaboration (under review)</li>
<li><p>CROSSMETA: INTEROPERABILITY FRAMEWORK BETWEEN VIRTUAL SPACES (under review)</p>
</li>
<li><p>A Novel Architecture Combining Oracle with Decentralized Learning For IIoT (Accepted by IEEE Internet of Things Journal, IoTJ, 2022)</p>
</li>
<li>A Model Training Mechanism based on On-chain and Off-chain Collaboration for Edge Computing (Published by IEEE International Conference on Communications, ICC, 2021)</li>
</ul>
<h2 id="参与论文"><a href="#参与论文" class="headerlink" title="参与论文"></a>参与论文</h2><ul>
<li><p>Effective Blockchain-Based Asynchronous Federated Learning for Edge-Computing (under review)</p>
</li>
<li><p>FedIM: An Anti-attack Federated Learning Based on Agent Importance Aggregation (Accepted by 2021 IEEE TrustCom workshop)</p>
</li>
<li><p>Select-Storage: A New Oracle Design Pattern on</p>
<p>Blockchain (Accepted by 2021 IEEE TrustCom workshop)</p>
</li>
<li><p>Information Sharing of Medical Resources for Emergency Rescue Based on Blockchain (Accepted by 2021 CENet workshop)</p>
</li>
</ul>
<h1 id="专利"><a href="#专利" class="headerlink" title="专利"></a>专利</h1><p>部分实审、部分初审。</p>
<ul>
<li>基于区块链的边缘智能系统装备</li>
<li>基于信誉模型和数字签名机制的区块链共识算法</li>
<li>一种数据交互系统和去中心化边缘模型训练验证方法</li>
<li>基于区块链的去中心化互联网协同系统和数据交互方法</li>
<li>一种基于区块链的异步联邦学习方法及系统</li>
<li>基于差分隐私法的联邦学习方法及装置</li>
<li>数据摘要生成方法、模型训练方法、相关装置及系统</li>
<li>一种车辆网数据共识优化存储方法及存储系统</li>
</ul>
<h1 id="软著"><a href="#软著" class="headerlink" title="软著"></a>软著</h1><ul>
<li>跨链预言机系统</li>
<li>区块链跨链交互系统</li>
</ul>
<h1 id="竞赛"><a href="#竞赛" class="headerlink" title="竞赛"></a>竞赛</h1><ul>
<li>2021年12月获得中国软件开源创新大赛开源项目创新赛二等奖,该比赛由北京大学、开放原子开源基金会等单位举办</li>
<li>2021年11月获得区块链服务网络BSN第三届开发者大赛一等奖,该比赛由国家发展和改革委员会城市和小城镇改革发展中心、区块链服务网络(BSN)联合中国移动创客马拉松大赛组委会主办</li>
<li>2021年10月获得第五届中国区块链开发大赛北部赛区三等奖,该比赛由中国电子技术标准化研究院、百度等单位举办</li>
<li>2021年6月获得HotChainers首届大学生区块链应用设计大赛自由赛道第一名,该比赛由Huobi Labs、沙河大学城大学生创业园、沙河高教园区高校联盟大学生创新创业工作联盟等单位举办</li>
</ul>
<h1 id="项目"><a href="#项目" class="headerlink" title="项目"></a>项目</h1><ul>
<li>2021国家公派留学联合培养博士生项目,尚未成行</li>
<li>2020-2022校级博士生创新基金(主持):链上链下协同机制研究,在研,8000元</li>
<li>2021-2024国家级基金(核心参与人员):区块链+边缘智能,在研</li>
<li>2021-2021自主命题(团队负责人):基于区块链的数据监管和任务协同解决方案,获得竞赛奖励(奖金累计50000元)</li>
<li>2020-2021通讯企业横向科研项目(研发团队负责人):区块链跨链系统,通过中国信通院可信区块链推进计划互操作组测试,结题</li>
<li>2020校级研究生创新创业项目(团队负责人):跨境贸易联盟链跨链交互技术及服务平台,结题,2000元</li>
</ul>
<h1 id="荣誉证书"><a href="#荣誉证书" class="headerlink" title="荣誉证书"></a>荣誉证书</h1><ul>
<li>北京市优秀毕业生、国重优秀研究生、优博后备计划、一等奖学金</li>
<li>法律职业资格证(客观:197 主观:122)</li>
<li>篮球裁判三级证</li>
</ul>
<h1 id="社会活动"><a href="#社会活动" class="headerlink" title="社会活动"></a>社会活动</h1><ul>
<li>通过OpenAtom XuperChain官方讲师认证培训考试</li>
<li>China Communications审稿人</li>
</ul>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">research</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/02/25/2021-Summary/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-node-version" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/02/22/node-version/">node version</a>
</h1>
<a href="/study.github.io/2022/02/22/node-version/" class="archive-article-date">
<time datetime="2022-02-22T10:57:30.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-02-22</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<p>hexo部署时出现<code>FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html</code>,原因是node版本过高,从14退回12即可</p>
<h1 id="node-版本回退"><a href="#node-版本回退" class="headerlink" title="node 版本回退"></a>node 版本回退</h1><p>安装node版本管理模块n <code>npm install n -g</code></p>
<p>版本降级 <code>sudo n 14</code></p>
<p>查看node版本是否已经降级 <code>node -v</code></p>
<h1 id="如果出现install和activate的版本不同"><a href="#如果出现install和activate的版本不同" class="headerlink" title="如果出现install和activate的版本不同"></a>如果出现install和activate的版本不同</h1><p>可以尝试<code>brew unlink node</code></p>
<p>如果没有效果,可以采用<code>nvm use v8.17.0</code>,查看node版本是否已经降级 <code>node -v</code></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">2022</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/02/22/node-version/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-xuperchain-go-sdk-sample" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/02/22/xuperchain-go-sdk-sample/">xuperchain-go-sdk-sample</a>
</h1>
<a href="/study.github.io/2022/02/22/xuperchain-go-sdk-sample/" class="archive-article-date">
<time datetime="2022-02-22T10:32:53.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-02-22</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<h1 id="启动网络"><a href="#启动网络" class="headerlink" title="启动网络"></a>启动网络</h1><p>参考:<a href="https://rookielinlucy666.github.io/study.github.io/2022/02/22/xuperchain/" target="_blank" rel="noopener">https://rookielinlucy666.github.io/study.github.io/2022/02/22/xuperchain/</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd xuperchain/output</span><br><span class="line">./xchain-cli createChain</span><br><span class="line">nohup ./xchain &</span><br></pre></td></tr></table></figure>
<h1 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br></pre></td><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"> "github.com/xuperchain/xuper-sdk-go/v2/account"</span><br><span class="line"> "github.com/xuperchain/xuper-sdk-go/v2/xuper"</span><br><span class="line"> "time"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">const (</span><br><span class="line"> Mnemonic = "锡 稳 拔 荣 非 吃 续 改 又 追 响 即" // CreateAccount生成的结果</span><br><span class="line"> Address = "geXLg6TC5C5gbK6YdLnPWJuU5kVWHdiLd" // CreateAccount生成的结果</span><br><span class="line"> Contract_Addr = "XC1234567890111112@xuper" // 指定合约地址并部署</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> CreateAccount</span><br><span class="line"> @Description: 创建账户</span><br><span class="line">**/</span><br><span class="line">func CreateAccount() {</span><br><span class="line"> var acc *account.Account</span><br><span class="line"> var err error</span><br><span class="line"> // 测试创建账户</span><br><span class="line"> acc, err = account.CreateAccount(1, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("create account error: %v\n", err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(acc)</span><br><span class="line"> fmt.Println(acc.Mnemonic)</span><br><span class="line"></span><br><span class="line"> // 测试恢复账户</span><br><span class="line"> acc, err = account.RetrieveAccount(Mnemonic, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("retrieveAccount err: %v\n", err)</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("RetrieveAccount: to %v\n", acc)</span><br><span class="line"></span><br><span class="line"> // 创建账户并存储到文件中</span><br><span class="line"> acc, err = account.CreateAndSaveAccountToFile("./keys", "123", 1, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("createAndSaveAccountToFile err: %v\n", err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("CreateAndSaveAccountToFile: %v\n", acc)</span><br><span class="line"></span><br><span class="line"> // 从文件中恢复账户</span><br><span class="line"> acc, err = account.GetAccountFromFile("keys/", "123")</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("getAccountFromFile err: %v\n", err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("getAccountFromFile: %v\n", acc)</span><br><span class="line"> return</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> CreateContractAccount</span><br><span class="line"> @Description:</span><br><span class="line"> 创建合约账户</span><br><span class="line"> 命令行创建合约账号:./xchain-cli account new --account 1234567890111111 --fee 1000</span><br><span class="line"> 生成的账户:XC1111111111111111@xuper</span><br><span class="line"> 在创建合约账号之前,需要给账户转钱,才能支付手续费(记得修改地址)</span><br><span class="line"> 命令行运行:./xchain-cli transfer --to geXLg6TC5C5gbK6YdLnPWJuU5kVWHdiLd --amount 100000000 --keys data/keys/ -H 127.0.0.1:37101</span><br><span class="line"> XC1111111111111111@xuper对应的account的助记词为巴 碱 仿 幼 浸 知 讼 朋 蒸 邵 雄 即</span><br><span class="line">**/</span><br><span class="line">func CreateContractAccount() {</span><br><span class="line"> // 从文件中恢复账户</span><br><span class="line"> acc, err := account.RetrieveAccount(Mnemonic, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("retrieveAccount err: %v\n", err)</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("RetrieveAccount: to %v\n", acc)</span><br><span class="line"></span><br><span class="line"> // 创建一个合约账户</span><br><span class="line"> // 合约账户是由 (XC + 16个数字 + @xuper) 组成, 比如 "XC1234567890123456@xuper"</span><br><span class="line"> contractAccount := Contract_Addr</span><br><span class="line"></span><br><span class="line"> xchainClient, err := xuper.New("127.0.0.1:37101")</span><br><span class="line"> tx, err := xchainClient.CreateContractAccount(acc, contractAccount)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("createContractAccount err:%s\n", err.Error())</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(tx.Tx.Txid)</span><br><span class="line"> return</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> akTransfer</span><br><span class="line"> @Description: 普通账户转账</span><br><span class="line"> @param to 目的账户</span><br><span class="line"> @param amount 金额</span><br><span class="line">**/</span><br><span class="line">func akTransfer(to *account.Account, amount string) {</span><br><span class="line"> // 创建或者使用已有账户,此处为使用已有账户。</span><br><span class="line"> // 恢复账户</span><br><span class="line"> //nuSMPvo6UUoTaT8mMQmHbfiRbJNbAymGh</span><br><span class="line"> //./xchain-cli transfer --to nuSMPvo6UUoTaT8mMQmHbfiRbJNbAymGh --amount 1000000000000 --keys data/keys/ -H 127.0.0.1:37101</span><br><span class="line"> from, err := account.RetrieveAccount(Mnemonic, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("retrieveAccount err: %v\n", err)</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("RetrieveAccount: to %v\n", from)</span><br><span class="line"></span><br><span class="line"> //to, err := account.CreateAccount(1, 1)</span><br><span class="line"> //if err != nil {</span><br><span class="line"> // panic(err)</span><br><span class="line"> //}</span><br><span class="line"> //fmt.Println(to.Address)</span><br><span class="line"> //fmt.Println(to.Mnemonic)</span><br><span class="line"></span><br><span class="line"> // 节点地址。</span><br><span class="line"> node := "127.0.0.1:37101"</span><br><span class="line"></span><br><span class="line"> // 创建节点客户端。</span><br><span class="line"> xclient, _ := xuper.New(node)</span><br><span class="line"></span><br><span class="line"> // 转账前查看两个地址余额。</span><br><span class="line"> fmt.Println(xclient.QueryBalance(from.Address))</span><br><span class="line"> fmt.Println(xclient.QueryBalance(to.Address))</span><br><span class="line"></span><br><span class="line"> tx, err := xclient.Transfer(from, to.Address, amount)</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("%x\n", tx.Tx.Txid)</span><br><span class="line"></span><br><span class="line"> // 转账后查看两个地址余额。</span><br><span class="line"> fmt.Println(xclient.QueryBalance(from.Address))</span><br><span class="line"> fmt.Println(xclient.QueryBalance(to.Address))</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> contractAccountTransfer</span><br><span class="line"> @Description:</span><br><span class="line"> 合约账户转账</span><br><span class="line"> 命令行给合约账户转账:./xchain-cli transfer --to XC1234567890111112@xuper --amount 1000000000000</span><br><span class="line">**/</span><br><span class="line">func contractAccountTransfer() {</span><br><span class="line"> // 创建或者使用已有账户,此处为新创建一个账户。</span><br><span class="line"> me, err := account.RetrieveAccount(Mnemonic, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("retrieveAccount err: %v\n", err)</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("RetrieveAccount: to %v\n", me)</span><br><span class="line"></span><br><span class="line"> //me, err := account.CreateAccount(1, 1)</span><br><span class="line"> //if err != nil {</span><br><span class="line"> // panic(err)</span><br><span class="line"> //}</span><br><span class="line"></span><br><span class="line"> akTransfer(me, "100")</span><br><span class="line"></span><br><span class="line"> // XC1234567890111111@xuper 为合约账户,如果没有合约账户需要先创建合约账户。</span><br><span class="line"> //该合约账户必须是账户生成的,否则会报错</span><br><span class="line"> me.SetContractAccount(Contract_Addr)</span><br><span class="line"> fmt.Println(me.Address)</span><br><span class="line"> fmt.Println(me.Mnemonic)</span><br><span class="line"> fmt.Println(me.GetContractAccount())</span><br><span class="line"> fmt.Println(me.GetAuthRequire())</span><br><span class="line"></span><br><span class="line"> to, err := account.CreateAccount(1, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(to.Address)</span><br><span class="line"> fmt.Println(to.Mnemonic)</span><br><span class="line"></span><br><span class="line"> // 节点地址。</span><br><span class="line"> node := "127.0.0.1:37101"</span><br><span class="line"> xclient, _ := xuper.New(node)</span><br><span class="line"></span><br><span class="line"> // 转账前查看两个地址余额。</span><br><span class="line"> fmt.Println(xclient.QueryBalance(me.GetContractAccount()))</span><br><span class="line"> fmt.Println(xclient.QueryBalance(to.Address))</span><br><span class="line"></span><br><span class="line"> tx, err := xclient.Transfer(me, to.Address, "10")</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("%x\n", tx.Tx.Txid)</span><br><span class="line"></span><br><span class="line"> // 转账后查看两个地址余额。</span><br><span class="line"> fmt.Println(xclient.QueryBalance(me.GetContractAccount())) // 转账时使用的是合约账户,因此查询余额时也是合约账户。</span><br><span class="line"> fmt.Println(xclient.QueryBalance(to.Address))</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> QueryBlockByHeight</span><br><span class="line"> @Description: 根据区块高度查询区块信息</span><br><span class="line"> @param height 区块高度</span><br><span class="line">**/</span><br><span class="line">func QueryBlockByHeight(height int64) {</span><br><span class="line"> // 示例代码省略了 err 的检查。</span><br><span class="line"> node := "127.0.0.1:37101"</span><br><span class="line"> xclient, _ := xuper.New(node)</span><br><span class="line"> blockResult, _ := xclient.QueryBlockByHeight(height)</span><br><span class="line"> if blockResult.GetHeader().GetError() != 0 {</span><br><span class="line"> // 处理错误。</span><br><span class="line"> } else {</span><br><span class="line"> // 处理区块数据。</span><br><span class="line"> block := blockResult.GetBlock()</span><br><span class="line"> fmt.Println(block.GetBlockid())</span><br><span class="line"> fmt.Println(block.GetHeight())</span><br><span class="line"> fmt.Println(block.GetTxCount())</span><br><span class="line"> fmt.Println(block.Transactions)</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> QueryTxByID</span><br><span class="line"> @Description: 根据交易ID查询交易</span><br><span class="line"> @param txID 交易ID</span><br><span class="line">**/</span><br><span class="line">func QueryTxByID(txID string) {</span><br><span class="line"> node := "127.0.0.1:37101"</span><br><span class="line"> xclient, _ := xuper.New(node)</span><br><span class="line"></span><br><span class="line"> output, _ := xclient.QueryTxByID(txID)</span><br><span class="line"> outputExt := output.GetTxOutputsExt()</span><br><span class="line"> // 输出合约事件内容</span><br><span class="line"> fmt.Println(string(outputExt[0].Key))</span><br><span class="line"> fmt.Println(string(outputExt[0].Value))</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> QueryBalance</span><br><span class="line"> @Description: 查询账户余额</span><br><span class="line">**/</span><br><span class="line">func QueryBalance() {</span><br><span class="line"> // 示例代码省略了 err 的检查。</span><br><span class="line"> node := "127.0.0.1:37101"</span><br><span class="line"> xclient, _ := xuper.New(node)</span><br><span class="line"></span><br><span class="line"> // 查询账户余额,默认 xuper 链。</span><br><span class="line"> bal, _ := xclient.QueryBalance(Contract_Addr)</span><br><span class="line"> fmt.Println(bal)</span><br><span class="line"></span><br><span class="line"> //// 查询账户余额,在 hello 链。</span><br><span class="line"> //bal, _ = xclient.QueryBalance("nuSMPvo6UUoTaT8mMQmHbfiRbJNbAymGh", xuper.WithQueryBcname("hello"))</span><br><span class="line"> //fmt.Println(bal)</span><br><span class="line"> //</span><br><span class="line"> //// 查询账户余额详细数据</span><br><span class="line"> //balDetails, _ := xclient.QueryBalanceDetail("nuSMPvo6UUoTaT8mMQmHbfiRbJNbAymGh")</span><br><span class="line"> //for _, bd := range balDetails {</span><br><span class="line"> // fmt.Println(bd.Balance)</span><br><span class="line"> // fmt.Println(bd.IsFrozen)</span><br><span class="line"> //}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> NativeContract</span><br><span class="line"> @Description:</span><br><span class="line"> 部署合约、调用合约、查询合约</span><br><span class="line"> 命令行部署合约:在output目录下运行`./xchain-cli wasm deploy --account XC1234567890111111@xuper --cname gocounter -a '{"creator":"xchain"}' ./counter --runtime go`</span><br><span class="line">**/</span><br><span class="line">func NativeContract() {</span><br><span class="line"> //codePath := "example/contract/counter" // 编译好的二进制文件 go build -o counter</span><br><span class="line"> //code, err := ioutil.ReadFile(codePath)</span><br><span class="line"> //if err != nil {</span><br><span class="line"> // panic(err)</span><br><span class="line"> //}</span><br><span class="line"></span><br><span class="line"> account, err := account.RetrieveAccount(Mnemonic, 1)</span><br><span class="line"> if err != nil {</span><br><span class="line"> fmt.Printf("retrieveAccount err: %v\n", err)</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("retrieveAccount address: %v\n", account.Address)</span><br><span class="line"> contractAccount := Contract_Addr</span><br><span class="line"> contractName := "SDKNativeCount2"</span><br><span class="line"> err = account.SetContractAccount(contractAccount)</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> xchainClient, err := xuper.New("127.0.0.1:37101")</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> args := map[string]string{</span><br><span class="line"> "creator": "xuperchain",</span><br><span class="line"> "key": "counter",</span><br><span class="line"> }</span><br><span class="line"> var tx *xuper.Transaction</span><br><span class="line"> //tx, err = xchainClient.DeployNativeGoContract(account, contractName, code, args)</span><br><span class="line"> //if err != nil {</span><br><span class="line"> // panic(err)</span><br><span class="line"> //}</span><br><span class="line"> //fmt.Printf("Deploy Native Go Contract Success! %x\n", tx.Tx.Txid)</span><br><span class="line"></span><br><span class="line"> tx, err = xchainClient.InvokeNativeContract(account, contractName, "increase", args)</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Printf("Invoke Native Go Contract Success! %x\n", tx.Tx.Txid)</span><br><span class="line"></span><br><span class="line"> tx, err = xchainClient.QueryNativeContract(account, contractName, "get", args)</span><br><span class="line"> if err != nil {</span><br><span class="line"> panic(err)</span><br><span class="line"> }</span><br><span class="line"> if tx != nil {</span><br><span class="line"> fmt.Printf("查询结果:%s\n", tx.ContractResponse.Body)</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> ListenEvent</span><br><span class="line"> @Description: 监听合约事件</span><br><span class="line"> @return error</span><br><span class="line">**/</span><br><span class="line">func ListenEvent() error {</span><br><span class="line"> // 创建节点客户端。</span><br><span class="line"> client, err := xuper.New("127.0.0.1:37101")</span><br><span class="line"> if err != nil {</span><br><span class="line"> return err</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 监听时间,返回 Watcher,通过 Watcher 中的 channel 获取block。</span><br><span class="line"> //过滤掉空数据</span><br><span class="line"> //watcher, err := client.WatchBlockEvent(xuper.WithSkipEmplyTx())</span><br><span class="line"> //通过事件名称去过滤</span><br><span class="line"> watcher, err := client.WatchBlockEvent(xuper.WithEventName("increase"))</span><br><span class="line"> if err != nil {</span><br><span class="line"> return err</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> go func() {</span><br><span class="line"> for {</span><br><span class="line"> b, ok := <-watcher.FilteredBlockChan</span><br><span class="line"> if !ok {</span><br><span class="line"> fmt.Println("watch block event channel closed.")</span><br><span class="line"> return</span><br><span class="line"> }</span><br><span class="line"> //fmt.Printf("%+v\n", b)</span><br><span class="line"> //QueryBlockByHeight(b.BlockHeight)</span><br><span class="line"> if len(b.Txs) != 0 {</span><br><span class="line"> QueryTxByID(b.Txs[0].Txid)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }()</span><br><span class="line"></span><br><span class="line"> time.Sleep(time.Second * 3)</span><br><span class="line"></span><br><span class="line"> // 关闭监听。</span><br><span class="line"> watcher.Close()</span><br><span class="line"> client.Close()</span><br><span class="line"> return nil</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> run</span><br><span class="line"> @Description: 运行代码</span><br><span class="line">**/</span><br><span class="line">func run() {</span><br><span class="line"> //CreateAccount()</span><br><span class="line"> //CreateContractAccount()</span><br><span class="line"> //akTransfer()</span><br><span class="line"> //contractAccountTransfer()</span><br><span class="line"> //QueryBlockByHeight()</span><br><span class="line"> QueryBalance()</span><br><span class="line"> //NativeContract()</span><br><span class="line"> //ListenEvent()</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>可能出现的错误:<code>createContractAccount err:PreExecWithSelectUTXO failed: rpc error: code = Unknown desc = NOT_ENOUGH_UTXO_ERROR
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x16c7081]</code>,请仔细阅读代码注释,通过命令行给账户转账,让账户中余额不为0</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">2022</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/02/22/xuperchain-go-sdk-sample/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-xuperchain" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2022/02/22/xuperchain/">xuperchain deployment</a>
</h1>
<a href="/study.github.io/2022/02/22/xuperchain/" class="archive-article-date">
<time datetime="2022-02-22T10:04:31.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-02-22</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<h1 id="资源网站"><a href="#资源网站" class="headerlink" title="资源网站"></a>资源网站</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">https://github.com/xuperchain/contract-sdk-go</span><br><span class="line">https://github.com/xuperchain/xuper-sdk-go</span><br><span class="line">https://github.com/xuperchain/xuperchain</span><br><span class="line">https://xuperchain.readthedocs.io/zh/latest/advanced_usage/create_contracts.html</span><br></pre></td></tr></table></figure>
<p>#Xuperchain 部署</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">#下载源码</span><br><span class="line">git clone https://github.com/xuperchain/xuperchain.git</span><br><span class="line">cd xuperchain</span><br><span class="line">#切换到3.10.3版本</span><br><span class="line">git checkout v3.10.3</span><br><span class="line">#编译</span><br><span class="line">make</span><br></pre></td></tr></table></figure>
<p>在编译的时候可能碰到以下问题:</p>
<blockquote>
<p>github.com/xuperchain/xuperchain/core/cmd/xdev/internal/jstest/core/cmd/xdev/internal/jstest/runner.go:165:37: cannot use testDeps{} (type testDeps) as type testing.testDeps in argument to testing.MainStart:<br>testDeps does not implement testing.testDeps (missing SetPanicOnExit0 method)<br>make: *** [build] Error 2</p>
</blockquote>
<p>这是源码中没写<code>SetPanicOnExit0</code>,解决方法如下:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#在源码的core/cmd/xdev/internal/jstest/deps.go</span><br><span class="line">func (t testDeps) ImportPath() string { return "" }</span><br><span class="line">func (t testDeps) StartTestLog(io.Writer) {}</span><br><span class="line">func (t testDeps) StopTestLog() error { return nil }</span><br><span class="line">#加入下面这行代码</span><br><span class="line">func (t testDeps) SetPanicOnExit0(bool) {}</span><br></pre></td></tr></table></figure>
<p>然后重新编译<code>make</code>,此时<code>xuperchain</code>目录下出现<code>output</code>文件,里面存放着编译好的可执行文件。</p>
<p>#创建区块链网络</p>
<p>此时,可以创建区块链了。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd output</span><br><span class="line">#创建区块链</span><br><span class="line">./xchain-cli createChain</span><br></pre></td></tr></table></figure>
<p>执行完成后,在<code>output</code>目录下的<code>data/blockchain/</code>中出现一个文件夹<code>xuper</code>,该文件夹即表示创建的区块链名称。如果网络出现错误,可以将其删除,然后在<code>output</code>目录下重新执行<code>./xchain-cli createChain</code>。</p>
<h1 id="运行全节点"><a href="#运行全节点" class="headerlink" title="运行全节点"></a>运行全节点</h1><p>在<code>output</code>目录下运行如下命令可启动全节点。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup ./xchain &</span><br></pre></td></tr></table></figure>
<p>在output目录下运行<code>cat nohup.out</code>可查看日志。如果sdk代码跑不通,或者是命令行无法执行xuperchain的命令,先查看日志判断网络是否宕机,随后进行下一步的判断。</p>
<p>如果一不小心运行两次,导致端口占用<code>127.0.0.1:37101/37200 has already been used</code>,可以执行:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#查询占用该端口号的进程</span><br><span class="line">lsof -i:37200 </span><br><span class="line">#杀死进程(pid为上个命令查出来的结果)</span><br><span class="line">kill pid</span><br></pre></td></tr></table></figure>
<p>如果想修改配置文件,但是不想关闭网络,也可以关闭全节点->修改配置文件->启动全节点。</p>
<h1 id="SDK-Go"><a href="#SDK-Go" class="headerlink" title="SDK-Go"></a>SDK-Go</h1><p>通过指定服务器地址和端口号即可连接区块链,注意:区块链部署在本机不用配置文件,即代码运行目录(注意是项目目录,不是xuperchain所在的目录)下不需要出现<code>conf/sdk.yaml</code>,否则会出现以下报错:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#合约账户和账户不匹配</span><br><span class="line">panic: Failed to post tx: TX_SIGN_ERROR</span><br><span class="line">panic: Failed to post tx: RWACL_INVALID_ERROR</span><br><span class="line">panic: EndorserCall PreExecWithFee failed: rpc error: code = Unknown desc = identity check failed</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">#单机部署不需要这个配置文件</span><br><span class="line"># endorseService Info</span><br><span class="line"># testNet addrs</span><br><span class="line">endorseServiceHost: "39.156.69.83:37100"</span><br><span class="line">complianceCheck:</span><br><span class="line"># 是否需要进行合规性背书</span><br><span class="line">isNeedComplianceCheck: false</span><br><span class="line"># 是否需要支付合规性背书费用</span><br><span class="line">isNeedComplianceCheckFee: false</span><br><span class="line"># 合规性背书费用</span><br><span class="line">complianceCheckEndorseServiceFee: 400</span><br><span class="line"># 支付合规性背书费用的收款地址</span><br><span class="line">complianceCheckEndorseServiceFeeAddr: aB2hpHnTBDxko3UoP2BpBZRujwhdcAFoT</span><br><span class="line"># 如果通过合规性检查,签发认证签名的地址</span><br><span class="line">complianceCheckEndorseServiceAddr: jknGxa6eyum1JrATWvSJKW3thJ9GKHA9n</span><br><span class="line">#创建平行链所需要的最低费用</span><br><span class="line">minNewChainAmount: "100"</span><br><span class="line">crypto: "xchain"</span><br><span class="line">txVersion: 1</span><br></pre></td></tr></table></figure>
<p>在涉及与区块链交互的操作时,需要做一些前提准备:</p>
<p>在<code>xuperchain/conf</code>(即xuperchain所在目录)修改<code>xchain.yaml</code>的<code>xendorser</code>的<code>enable</code>状态设置为<code>true</code>,否则会出现以下问题:</p>
<blockquote>
<p>PreExecWithSelected UTXO failed: rpc error: code = Unimplemented sesc = unkonwn service pb.Xchain</p>
<p>Panic: runtime error: invalid memory address or nil pointer dereference</p>
</blockquote>
<p>同时,为了运行go合约和监听事件,需要将<code>xchain.yaml</code>中的<code>native</code>和<code>event</code>的<code>enable</code>都改为<code>true</code>。</p>
<p>在使用命令行部署合约时,需要在项目目录中执行<code>go build -o counter.go</code>命令,然后将生成的可执行文件<code>counter</code>复制到<code>output</code>目录下,随后执行以下命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./xchain-cli native deploy --account XC1234567890111111@xuper --fee 15587517 --runtime go -a '{"creator":"XC1234567890111111@xuper"}' --cname golangcounter</span><br></pre></td></tr></table></figure>
<p>注意:一定要保证合约账户是有余额的,否则会出现<code>NOT ENGOUGH</code>的报错。可以运行命令行或者是示例代码进行转账,具体的内容已在<code>oracle/main.go</code>中提示,在此不赘述。</p>
<p>部署和调用合约时,可能出现以下错误:</p>
<blockquote>
<p>desc = run wasm2c, …, bad magic value</p>
</blockquote>
<p>现在超级链已经不支持将编译后的go合约转换为wasm格式了,所以不要去修改相应的<code>conf/xchain.yaml</code>文件。</p>
<blockquote>
<p>Panic: PreExecWithSelectUTXO failed: rpc error: code = Unknown desc = contract type native not found</p>
</blockquote>
<p>此时,首先检查<code>output</code>目录下的<code>nohup.out</code>日志,查看网络的状态是否完好,命令是否执行成功。如果网络宕机,则删掉网络对应的文件夹,重新启动。</p>
<p>当账户和合约账户不匹配时,可能出现以下两个错误:</p>
<blockquote>
<p>panic: Failed to post tx: TX_SIGN_ERROR</p>
<p>panic: Failed to post tx: RWACL_INVALID_ERROR</p>
</blockquote>
<p>需要保证合约账户是该账户生成的即可。</p>
<p>由于xuperchain版本变更的问题,在使用<code>go mod</code>可能出现以下问题:</p>
<blockquote>
<p>SECURITY ERROR<br>This download does NOT match the one reported by the checksum server.<br>The bits may have been replaced on the origin server, or an attacker may<br>have intercepted the download attempt.</p>
</blockquote>
<p>此时,先暂时关闭<code>go mod</code>的验证,待到下载完成之后,再开启验证。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">go env -w GOSUMDB=off</span><br><span class="line">go mod tidy</span><br><span class="line">go env -w GOSUMDB=GOSUMDB="sum.golang.org"</span><br></pre></td></tr></table></figure>
<p>当结果中出现<code>no config file in ./conf/sdk.yaml, use default config: &{10.144.94.18:8848 {false false 10 XBbhR82cB6PvaLJs3D4uB9f12bhmKkHeX TYyA3y8wdFZyzExtcbRNVd7ZZ2XXcfjdw} 100 xchain 0}</code>的日志提示时,不用理会,直接跳过即可。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">2022</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2022/02/22/xuperchain/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-wireshark-remote" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2020/12/15/wireshark-remote/">wireshark-remote:macos用wireshark监听服务器端流量</a>
</h1>
<a href="/study.github.io/2020/12/15/wireshark-remote/" class="archive-article-date">
<time datetime="2020-12-15T08:55:47.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2020-12-15</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<p>需求:监听部署在服务器上的go应用流量</p>
<h1 id="golang配置goproxy"><a href="#golang配置goproxy" class="headerlink" title="golang配置goproxy"></a>golang配置goproxy</h1><p>来源:<a href="https://www.cnblogs.com/rongfengliang/p/11419210.html" target="_blank" rel="noopener">https://www.cnblogs.com/rongfengliang/p/11419210.html</a></p>
<p>作者:rongfengliang-荣锋亮</p>
<ul>
<li>阿里云<br>配置如下:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://mirrors.aliyun.com/goproxy/</span><br></pre></td></tr></table></figure>
<ul>
<li>nexus社区提供的<br>配置如下:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://gonexus.dev</span><br></pre></td></tr></table></figure>
<ul>
<li>goproxy.io 的<br>配置如下:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://goproxy.io/</span><br></pre></td></tr></table></figure>
<ul>
<li>基于athens的公共服务<br>配置如下:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://athens.azurefd.net</span><br></pre></td></tr></table></figure>
<ul>
<li>官方提供的(jfrog,golang)</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://gocenter.io</span><br><span class="line">export GOPROXY=https://proxy.golang.org</span><br></pre></td></tr></table></figure>
<ul>
<li>七牛云赞助支持的</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export GOPROXY=https://goproxy.cn</span><br></pre></td></tr></table></figure>
<h1 id="wireshark远程监听网卡、本地环回地址"><a href="#wireshark远程监听网卡、本地环回地址" class="headerlink" title="wireshark远程监听网卡、本地环回地址"></a>wireshark远程监听网卡、本地环回地址</h1><p>来源:</p>
<ul>
<li>tamper-Mac Lion使用wireshark远程抓包 <a href="https://www.cnblogs.com/tamer/archive/2012/07/16/2593422.html" target="_blank" rel="noopener">https://www.cnblogs.com/tamer/archive/2012/07/16/2593422.html</a></li>
<li>a_little_a_day:sudo:no tty present and no askpass program specified 解决方法 <a href="https://blog.csdn.net/a_little_a_day/article/details/78282983" target="_blank" rel="noopener">https://blog.csdn.net/a_little_a_day/article/details/78282983</a></li>
<li><p>dumpcap使用资料 <a href="https://www.wireshark.org/docs/wsug_html_chunked/AppToolsdumpcap.html" target="_blank" rel="noopener">https://www.wireshark.org/docs/wsug_html_chunked/AppToolsdumpcap.html</a></p>
<h3 id="Mac-os安装wireshark"><a href="#Mac-os安装wireshark" class="headerlink" title="Mac os安装wireshark"></a>Mac os安装wireshark</h3></li>
</ul>
<p><a href="https://www.wireshark.org/" target="_blank" rel="noopener">https://www.wireshark.org/</a></p>
<h3 id="Ubuntu16-04安装wireshark"><a href="#Ubuntu16-04安装wireshark" class="headerlink" title="Ubuntu16.04安装wireshark"></a>Ubuntu16.04安装wireshark</h3><p><a href="https://www.cnblogs.com/EasonJim/p/7123058.html" target="_blank" rel="noopener">https://www.cnblogs.com/EasonJim/p/7123058.html</a></p>
<h3 id="在Macos终端输入以下命令"><a href="#在Macos终端输入以下命令" class="headerlink" title="在Macos终端输入以下命令"></a>在Macos终端输入以下命令</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#监听服务器的网卡流量</span><br><span class="line">ssh remote-host 'sudo tshark -w - -f "not port 22" ' | wireshark -k -i - </span><br><span class="line"></span><br><span class="line">#监听服务器的本地环回流量</span><br><span class="line">ssh remote-host 'sudo tshark -w - -f "not port 22" -i loopback' | wireshark -k -i -</span><br><span class="line"></span><br><span class="line">#监听度武器的网卡流量并保存到macos的指定位置</span><br><span class="line">ssh tom@10.3.242.100 'sudo tshark -w - -f "not port 22" ' | wireshark -k -i - -w ~/Desktop/result/fisco-proxy/100.pcap</span><br></pre></td></tr></table></figure>
<h1 id="Linux新增用户并设置管理员权限"><a href="#Linux新增用户并设置管理员权限" class="headerlink" title="Linux新增用户并设置管理员权限"></a>Linux新增用户并设置管理员权限</h1><p><a href="https://www.cnblogs.com/fjzhang/p/11345099.html" target="_blank" rel="noopener">https://www.cnblogs.com/fjzhang/p/11345099.html</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/sudoers</span><br><span class="line"></span><br><span class="line">tom ALL=(ALL:ALL) NOPASSWD:ALL</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">2020</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2020/12/15/wireshark-remote/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-fisco-gosdk" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/study.github.io/2020/11/06/fisco-gosdk/">FISCOBCOS Go SDK Tutorial</a>
</h1>
<a href="/study.github.io/2020/11/06/fisco-gosdk/" class="archive-article-date">
<time datetime="2020-11-06T02:08:25.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2020-11-06</time>
</a>
</header>
<!-- 目录内容 -->
<!-- 目录内容结束 -->
<div class="article-entry" itemprop="articleBody">
<h1 id="FISCO-BCOS-Go-SDK-调用流程"><a href="#FISCO-BCOS-Go-SDK-调用流程" class="headerlink" title="FISCO BCOS Go-SDK 调用流程"></a>FISCO BCOS Go-SDK 调用流程</h1><p>首先声明,本文不涉及国密调用流程,有国密需求请到官方github中获取信息。<br>在<a href="https://github.com/FISCO-BCOS/go-sdk">官方github说明</a>稍作修改,让教程更加方便快捷。</p>
<h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><ul>
<li>Golang, 版本需不低于1.13.6,项目采用go module进行包管理。</li>
<li>FISCO BCOS 2.2.0+, 需要提前运行FISCOBCOS区块链平台<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cd ~/fisco/</span><br><span class="line">bash nodes/127.0.0.1/start_all.sh</span><br><span class="line">cp nodes/127.0.0.1/sdk/* console/conf/</span><br><span class="line">cd ~/fisco/console && bash start.sh #启动成功后,退出即可</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>启动FISCO BCOS平台后,拷贝证书<code>ca.crt/sdk.crt/sdk.key</code>到当前项目目录下,目录结构如下所示。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">├── Store.go</span><br><span class="line">├── account.go</span><br><span class="line">├── ca.crt</span><br><span class="line">├── code</span><br><span class="line">├── contract</span><br><span class="line">│ └── Store.sol</span><br><span class="line">├── go-sdk</span><br><span class="line">├── go.mod</span><br><span class="line">├── go.sum</span><br><span class="line">├── main.go</span><br><span class="line">├── sdk.crt</span><br><span class="line">├── sdk.key</span><br><span class="line">└── vendor</span><br></pre></td></tr></table></figure></p>
<ul>
<li>Solidity编译器,默认0.4.25版本<h2 id="配置文件说明(看看即可,具体实现方式会在下文给出代码)"><a href="#配置文件说明(看看即可,具体实现方式会在下文给出代码)" class="headerlink" title="配置文件说明(看看即可,具体实现方式会在下文给出代码)"></a>配置文件说明(看看即可,具体实现方式会在下文给出代码)</h2>这个文件即下文所说的<code>config.toml</code>。<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">[Network]</span><br><span class="line">#type rpc or channel</span><br><span class="line">Type="channel"</span><br><span class="line">CAFile="ca.crt"</span><br><span class="line">Cert="sdk.crt"</span><br><span class="line">Key="sdk.key"</span><br><span class="line">[[Network.Connection]]</span><br><span class="line">NodeURL="127.0.0.1:20200"</span><br><span class="line">GroupID=1</span><br><span class="line"># [[Network.Connection]]</span><br><span class="line"># NodeURL="127.0.0.1:20200"</span><br><span class="line"># GroupID=2</span><br><span class="line"></span><br><span class="line">[Account]</span><br><span class="line"># only support PEM format for now</span><br><span class="line">KeyFile=".ci/0x83309d045a19c44dc3722d15a6abd472f95866ac.pem"</span><br><span class="line"></span><br><span class="line">[Chain]</span><br><span class="line">ChainID=1</span><br><span class="line">SMCrypto=false</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h3 id="Network"><a href="#Network" class="headerlink" title="Network"></a>Network</h3><ul>
<li>Type:支持channel和rpc两种模式,其中channel使用ssl链接,需要提供证书。rpc使用http访问节点。</li>
<li>CAFile:链根证书</li>
<li>Cert:SDK建立SSL链接时使用的证书</li>
<li>Key:SDK建立SSL链接时使用的证书对应的私钥</li>
<li>Network.Connection数组,配置节点信息,可配置多个。<h3 id="Account-看看如何生成即可,具体实现方式在下文代码中体现"><a href="#Account-看看如何生成即可,具体实现方式在下文代码中体现" class="headerlink" title="Account(看看如何生成即可,具体实现方式在下文代码中体现)"></a>Account(看看如何生成即可,具体实现方式在下文代码中体现)</h3></li>
<li>KeyFile:节点签发交易时所使用的私钥,PEM格式,支持国密和非国密。<h4 id="使用脚本生成"><a href="#使用脚本生成" class="headerlink" title="使用脚本生成"></a>使用脚本生成</h4><a href="https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/account.html" target="_blank" rel="noopener">https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/account.html</a></li>
<li>获取脚本<br><code>curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/console/master/tools/get_account.sh && chmod u+x get_account.sh && bash get_account.sh -h</code></li>
<li>生成私钥、地址和账户<br><code>bash get_account.sh</code><br>此时,当前目录的accounts文件夹下包含公私钥文件。<h4 id="使用Go-SDK代码生成"><a href="#使用Go-SDK代码生成" class="headerlink" title="使用Go-SDK代码生成"></a>使用Go-SDK代码生成</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><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"> "crypto/ecdsa"</span><br><span class="line"> "fmt"</span><br><span class="line"> "log"</span><br><span class="line"> "os"</span><br><span class="line"> "github.com/ethereum/go-ethereum/crypto"</span><br><span class="line"> "github.com/ethereum/go-ethereum/common/hexutil"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> privateKey, err := crypto.GenerateKey()</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> privateKeyBytes := crypto.FromECDSA(privateKey)</span><br><span class="line"> fmt.Println("private key: ", hexutil.Encode(privateKeyBytes)[2:]) // privateKey in hex without "0x"</span><br><span class="line"></span><br><span class="line"> publicKey := privateKey.Public()</span><br><span class="line"> publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)</span><br><span class="line"> if !ok {</span><br><span class="line"> log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)</span><br><span class="line"> fmt.Println("publick key: ", hexutil.Encode(publicKeyBytes)[4:]) // publicKey in hex without "0x"</span><br><span class="line"></span><br><span class="line"> address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()</span><br><span class="line"> fmt.Println("address: ", address) // account address</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h3 id="Chain"><a href="#Chain" class="headerlink" title="Chain"></a>Chain</h3><ul>
<li>ChainID:链ID,与节点config.ini中chain.id保持一致。</li>
<li>SMCrypto:链使用的签名算法,ture表示使用国密SM2,false表示使用普通ECDSA。<h2 id="控制台使用(看看即可,可以看看go-sdk源码,里面包含测试用例,对下面调用很有帮助)"><a href="#控制台使用(看看即可,可以看看go-sdk源码,里面包含测试用例,对下面调用很有帮助)" class="headerlink" title="控制台使用(看看即可,可以看看go-sdk源码,里面包含测试用例,对下面调用很有帮助)"></a>控制台使用(看看即可,可以看看go-sdk源码,里面包含测试用例,对下面调用很有帮助)</h2>在使用控制台需要先拉取代码或下载代码,然后对配置文件<code>config.toml</code>进行更改:</li>
</ul>
<p>1.拉取代码并编译<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/FISCO-BCOS/go-sdk.git</span><br><span class="line">cd go-sdk</span><br><span class="line">go build cmd/console.go</span><br></pre></td></tr></table></figure></p>
<p>2.搭建FISCO BCOS 2.2以上版本节点。<br>3.<code>config.toml</code>默认使用channel模式,请拷贝对应的SDK证书。<br>4.最后,运行控制台查看可用指令:<br>./console help</p>
<h2 id="Solidity合约编译为Go文件"><a href="#Solidity合约编译为Go文件" class="headerlink" title="Solidity合约编译为Go文件"></a>Solidity合约编译为Go文件</h2><p>在利用SDK进行项目开发时,对智能合约进行操作时需要将Solidity智能合约利用go-sdk的<code>abigen</code>工具转换为<code>Go</code>文件代码。整体上主要包含了五个流程:</p>
<ul>
<li>准备需要编译的智能合约</li>
<li>配置好相应版本的solc编译器</li>
<li>构建go-sdk的合约编译工具abigen</li>
<li>编译生成go文件</li>
<li>使用生成的go文件进行合约调用<br>1.提供一份简单的样例智能合约<code>Store.sol</code>如下:<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">pragma solidity ^0.4.25;</span><br><span class="line"></span><br><span class="line">contract Store {</span><br><span class="line"> event ItemSet(bytes32 key, bytes32 value);</span><br><span class="line"></span><br><span class="line"> string public version;</span><br><span class="line"> mapping (bytes32 => bytes32) public items;</span><br><span class="line"></span><br><span class="line"> constructor(string _version) public {</span><br><span class="line"> version = _version;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> function setItem(bytes32 key, bytes32 value) external {</span><br><span class="line"> items[key] = value;</span><br><span class="line"> emit ItemSet(key, value);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>2.安装对应版本的solc编译器,目前FISCO BCOS默认的solc编译器版本为0.4.25。(下载<code>go-sdk</code>,即可在相应目录下进行编译)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash tools/download_solc.sh -v 0.4.25</span><br></pre></td></tr></table></figure></p>
<p>3.构建<code>go-sdk</code>的代码生成工具<code>abigen</code>(均在<code>go-sdk</code>的目录下编译)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># 下面指令在go-sdk目录下操作,编译生成abigen工具</span><br><span class="line">go build ./cmd/abigen</span><br></pre></td></tr></table></figure></p>
<p>执行命令后,检查根目录下是否存在<code>abigen</code>,并将准备的智能合约<code>Store.sol</code>放置在一个新的目录下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir ./store</span><br><span class="line">mv Store.sol ./store</span><br></pre></td></tr></table></figure></p>
<p>4.编译生成go文件,先利用solc将合约文件生成abi和bin文件,以前面所提供的Store.sol为例<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./solc-0.4.25 --bin --abi -o ./store ./store/Store.sol</span><br></pre></td></tr></table></figure></p>
<p>Store.sol目录下会生成Store.bin和Store.abi。此时利用abigen工具将Store.bin和Store.abi转换成Store.go:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./abigen --bin ./store/Store.bin --abi ./store/Store.abi --pkg store --type Store --out ./store/Store.go</span><br></pre></td></tr></table></figure></p>
<p>最后store目录下面存在以下文件:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Store.abi Store.bin Store.go Store.sol</span><br></pre></td></tr></table></figure></p>
<p>将Store.go复制到项目目录下,项目结构如下所示:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">├── Store.go</span><br><span class="line">├── account.go</span><br><span class="line">├── ca.crt</span><br><span class="line">├── code</span><br><span class="line">├── contract</span><br><span class="line">│ └── Store.sol</span><br><span class="line">├── go-sdk</span><br><span class="line">├── go.mod</span><br><span class="line">├── go.sum</span><br><span class="line">├── main.go</span><br><span class="line">├── sdk.crt</span><br><span class="line">├── sdk.key</span><br><span class="line">└── vendor</span><br></pre></td></tr></table></figure></p>
<h2 id="部署智能合约"><a href="#部署智能合约" class="headerlink" title="部署智能合约"></a>部署智能合约</h2><p>创建main函数,调用Store合约,<code>touch main.go</code>。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><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"> "encoding/hex"</span><br><span class="line"> "fmt"</span><br><span class="line"> "log"</span><br><span class="line"></span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/client"</span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/conf"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> privateKeyStr, _, _ := generateAccount()</span><br><span class="line"> privateKey, _ := hex.DecodeString(privateKeyStr)</span><br><span class="line"> config := &conf.Config{IsHTTP: false, ChainID: 1, IsSMCrypto: false, GroupID: 1, CAFile: "ca.crt", Key: "sdk.key", Cert: "sdk.crt",</span><br><span class="line"> PrivateKey: privateKey, NodeURL: "127.0.0.1:20200"}</span><br><span class="line"> client, err := client.Dial(config)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"> input := "Store deployment 1.0"</span><br><span class="line"> address, tx, instance, err := DeployStore(client.GetTransactOpts(), client, input)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Println("contract address: ", address.Hex()) // the address should be saved</span><br><span class="line"> fmt.Println("transaction hash: ", tx.Hash().Hex())</span><br><span class="line"> _ = instance</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>其中生成外部账户的<code>generateAccount()</code>在<code>account.go</code>文件中。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><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"> "crypto/ecdsa"</span><br><span class="line"> "fmt"</span><br><span class="line"> "log"</span><br><span class="line"></span><br><span class="line"> "github.com/ethereum/go-ethereum/common/hexutil"</span><br><span class="line"> "github.com/ethereum/go-ethereum/crypto"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">func generateAccount() (string, string, string) {</span><br><span class="line"> privateKey, err := crypto.GenerateKey()</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> privateKeyBytes := crypto.FromECDSA(privateKey)</span><br><span class="line"> privateKeyStr := hexutil.Encode(privateKeyBytes)[2:] // privateKey in hex without "0x"</span><br><span class="line"></span><br><span class="line"> publicKey := privateKey.Public()</span><br><span class="line"> publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)</span><br><span class="line"> if !ok {</span><br><span class="line"> log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)</span><br><span class="line"> publicKeyStr := hexutil.Encode(publicKeyBytes)[4:] // publicKey in hex without "0x"</span><br><span class="line"></span><br><span class="line"> address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()</span><br><span class="line"> addressStr := address // account address</span><br><span class="line"></span><br><span class="line"> return privateKeyStr, publicKeyStr, addressStr</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">func typeof(v interface{}) string {</span><br><span class="line"> return fmt.Sprintf("%T", v)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>此时运行项目<code>go run *.go</code>,出现以下内容,则成功部署智能合约。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">contract address:0xA6CBac6EE073b345298Dc6909240a067B5220C6B</span><br><span class="line">transaction hash: 0xf81e158b29c9fa2db53b1bfb8e73170de8116f85b4a21cf6084fcbe9c81e7796</span><br></pre></td></tr></table></figure></p>
<h2 id="加载智能合约并调用查询接口"><a href="#加载智能合约并调用查询接口" class="headerlink" title="加载智能合约并调用查询接口"></a>加载智能合约并调用查询接口</h2><p>在部署过程中设置的Store.sol合约中有一个名为version的全局变量。 因为它是公开的,这意味着它们将成为我们自动创建的getter函数。常量和view函数也接受bind.CallOpts作为第一个参数。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><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"> "encoding/hex"</span><br><span class="line"> "fmt"</span><br><span class="line"> "log"</span><br><span class="line"></span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/client"</span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/conf"</span><br><span class="line"> "github.com/ethereum/go-ethereum/common"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> privateKeyStr, _, _ := generateAccount()</span><br><span class="line"> privateKey, _ := hex.DecodeString(privateKeyStr)</span><br><span class="line"> config := &conf.Config{IsHTTP: false, ChainID: 1, IsSMCrypto: false, GroupID: 1, CAFile: "ca.crt", Key: "sdk.key", Cert: "sdk.crt",</span><br><span class="line"> PrivateKey: privateKey, NodeURL: "127.0.0.1:20200"}</span><br><span class="line"> client, err := client.Dial(config)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //Deploy Smart Contracts</span><br><span class="line"></span><br><span class="line"> // input := "Store deployment 1.0"</span><br><span class="line"> // address, tx, instance, err := DeployStore(client.GetTransactOpts(), client, input)</span><br><span class="line"> // if err != nil {</span><br><span class="line"> // log.Fatal(err)</span><br><span class="line"> // }</span><br><span class="line"> // fmt.Println("contract address: ", address.Hex()) // the address should be saved</span><br><span class="line"> // fmt.Println("transaction hash: ", tx.Hash().Hex())</span><br><span class="line"> // _ = instance</span><br><span class="line"></span><br><span class="line"> // contract address: 0xA6CBac6EE073b345298Dc6909240a067B5220C6B</span><br><span class="line"> // transaction hash: 0xf81e158b29c9fa2db53b1bfb8e73170de8116f85b4a21cf6084fcbe9c81e7796</span><br><span class="line"></span><br><span class="line"> //Load Contracts and Query</span><br><span class="line"> contractAddress := common.HexToAddress("0xA6CBac6EE073b345298Dc6909240a067B5220C6B")</span><br><span class="line"> instance, err := NewStore(contractAddress, client)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> storeSession := &StoreSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}</span><br><span class="line"></span><br><span class="line"> version, err := storeSession.Version()</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> fmt.Println("version :", version)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h2 id="调用智能合约写接口"><a href="#调用智能合约写接口" class="headerlink" title="调用智能合约写接口"></a>调用智能合约写接口</h2><p>写入智能合约需要我们用私钥来对交易事务进行签名,我们创建的智能合约有一个名为SetItem的外部方法,它接受soliditybytes32类型的两个参数(key,value)。 这意味着在Go文件中需要传递一个长度为32个字节的字节数组。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><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"> "encoding/hex"</span><br><span class="line"> "fmt"</span><br><span class="line"> "log"</span><br><span class="line"></span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/client"</span><br><span class="line"> "github.com/FISCO-BCOS/go-sdk/conf"</span><br><span class="line"> "github.com/ethereum/go-ethereum/common"</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> privateKeyStr, _, _ := generateAccount()</span><br><span class="line"> privateKey, _ := hex.DecodeString(privateKeyStr)</span><br><span class="line"> config := &conf.Config{IsHTTP: false, ChainID: 1, IsSMCrypto: false, GroupID: 1, CAFile: "ca.crt", Key: "sdk.key", Cert: "sdk.crt",</span><br><span class="line"> PrivateKey: privateKey, NodeURL: "127.0.0.1:20200"}</span><br><span class="line"> client, err := client.Dial(config)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //Deploy Smart Contracts</span><br><span class="line"></span><br><span class="line"> // input := "Store deployment 1.0"</span><br><span class="line"> // address, tx, instance, err := DeployStore(client.GetTransactOpts(), client, input)</span><br><span class="line"> // if err != nil {</span><br><span class="line"> // log.Fatal(err)</span><br><span class="line"> // }</span><br><span class="line"> // fmt.Println("contract address: ", address.Hex()) // the address should be saved</span><br><span class="line"> // fmt.Println("transaction hash: ", tx.Hash().Hex())</span><br><span class="line"> // _ = instance</span><br><span class="line"></span><br><span class="line"> // contract address: 0xA6CBac6EE073b345298Dc6909240a067B5220C6B</span><br><span class="line"> // transaction hash: 0xf81e158b29c9fa2db53b1bfb8e73170de8116f85b4a21cf6084fcbe9c81e7796</span><br><span class="line"></span><br><span class="line"> //Load Contracts and Query</span><br><span class="line"> contractAddress := common.HexToAddress("0xA6CBac6EE073b345298Dc6909240a067B5220C6B")</span><br><span class="line"> instance, err := NewStore(contractAddress, client)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> storeSession := &StoreSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}</span><br><span class="line"></span><br><span class="line"> version, err := storeSession.Version()</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> fmt.Println("version :", version)</span><br><span class="line"></span><br><span class="line"> key := [32]byte{}</span><br><span class="line"> value := [32]byte{}</span><br><span class="line"> copy(key[:], []byte("foo"))</span><br><span class="line"> copy(value[:], []byte("bar"))</span><br><span class="line"></span><br><span class="line"> tx, receipt, err := storeSession.SetItem(key, value)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> fmt.Printf("tx sent: %s\n", tx.Hash().Hex())</span><br><span class="line"> fmt.Printf("transaction hash of receipt: %s\n", receipt.GetTransactionHash())</span><br><span class="line"></span><br><span class="line"> //**************Seems useless******************</span><br><span class="line"> // wait for the mining</span><br><span class="line"> // receipt, err := client.WaitMined(tx)</span><br><span class="line"> // if err != nil {</span><br><span class="line"> // log.Fatalf("tx mining error:%v\n", err)</span><br><span class="line"> // }</span><br><span class="line"> //*********************************************</span><br><span class="line"></span><br><span class="line"> // read the result</span><br><span class="line"> result, err := storeSession.Items(key)</span><br><span class="line"> if err != nil {</span><br><span class="line"> log.Fatal(err)</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(string(result[:])) // "bar"</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>输出结果如下即为成功:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">version : Store deployment 1.0</span><br><span class="line">tx sent: 0xe89e6eb586e096adbdceb1d83938ef914380c6f102b0635a512e53e26f4a6df7</span><br><span class="line">transaction hash of receipt: 0xe89e6eb586e096adbdceb1d83938ef914380c6f102b0635a512e53e26f4a6df7</span><br><span class="line">bar</span><br></pre></td></tr></table></figure></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">2020</a>
</li>
</ul>
</div>
<p class="article-more-link">
<a class="article-more-a" href="/study.github.io/2020/11/06/fisco-gosdk/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>