-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1495 lines (995 loc) · 175 KB
/
index.html
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 charset="utf-8">
<title>Auodesy</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="shortcut icon" href="/favicon.png">
<link rel="stylesheet" href="/css/style.css">
<meta name="generator" content="Hexo 7.3.0"></head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">Auodesy</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
<a class="main-nav-link" href="/categories">Categories</a>
<a class="main-nav-link" href="/tags">Tags</a>
<a class="main-nav-link" href="/about">About</a>
</nav>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-solidity入门1" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/01/21/solidity%E5%85%A5%E9%97%A81/" class="article-date">
<time class="dt-published" datetime="2025-01-21T12:54:35.000Z" itemprop="datePublished">2025-01-21</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/01/21/solidity%E5%85%A5%E9%97%A81/">solidity入门1</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="solidity入门1"><a href="#solidity入门1" class="headerlink" title="solidity入门1"></a>solidity入门1</h1><p>面向对象的,静态类型,支持继承、库和复杂的用户定义类型,以及其他功能。</p>
<p>面向以太坊虚拟机EVM</p>
<h2 id="了解智能合约基础"><a href="#了解智能合约基础" class="headerlink" title="了解智能合约基础"></a>了解智能合约基础</h2><p>存储</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">// SPDX-License-Identifier: GPL-3.0</span><br><span class="line">pragma solidity >=0.4.16 <0.9.0;</span><br><span class="line"></span><br><span class="line">contract SimpleStorage {</span><br><span class="line"> uint storedData;</span><br><span class="line"></span><br><span class="line"> function set(uint x) public {</span><br><span class="line"> storedData = x;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> function get() public view returns (uint) {</span><br><span class="line"> return storedData;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>源代码根据GPL3.0版本授权</p>
<p>此处是版本编译指示,</p>
<p>大于0.4.16小于0.9.0版本</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pragma solidity ^0.5.2;</span><br></pre></td></tr></table></figure>
<p>该代码的源文件在0.5.2版本之前的编译器不能编译,在0.6.0版本之后的编译器上也不能编译</p>
<p>这些规则与 <a target="_blank" rel="noopener" href="https://docs.npmjs.com/cli/v6/using-npm/semver">npm</a> 使用相同的语法</p>
<p>Solidity意义上的合约是代码(其 <em>函数</em>)和数据(其 <em>状态</em>)的集合, 驻留在以太坊区块链的一个特定地址。</p>
<p><code>uint storedData;</code> 声明了一个名为 <code>storedData</code> 的状态变量, 类型为 <code>uint</code> ( <em>u</em>nsigned <em>int</em>eger,共 <em>256</em> 位)</p>
<p>(type):unix</p>
<p>():该函数不接受任何参数</p>
<p>**<code>public</code>**:这是函数的可见性修饰符,表示该函数可以被任何外部账户或合约调用,也可以被合约内的其他函数调用。</p>
<p>**<code>view</code>**:这个修饰符表明该函数不会修改合约的状态(即不会改变任何状态变量的值),它只会读取存储在区块链上的数据。</p>
<h2 id="solidity源文件结构"><a href="#solidity源文件结构" class="headerlink" title="solidity源文件结构"></a>solidity源文件结构</h2><p>contract ,import,pragma,</p>
<p>using for,struct,enum,function,error,constant</p>
<h3 id="SPDX-许可标识符"><a href="#SPDX-许可标识符" class="headerlink" title="SPDX 许可标识符"></a>SPDX 许可标识符</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">// SPDX-License-Identifier: MIT</span><br></pre></td></tr></table></figure>
<p>如果您不想指定一个许可,或者源代码不是开源的, 请使用特殊值 <code>UNLICENSED</code>。请注意, <code>UNLICENSED</code> (不允许使用, 不存在于SPDX许可证列表中)与 <code>UNLICENSE</code> (授予所有人所有权利)不同。</p>
<h3 id="pragma"><a href="#pragma" class="headerlink" title="pragma"></a>pragma</h3><p>:启用某些编译器特性或检查。始终是源文件的本地指令。import另一个文件,该文件的pragma指令不会自动应用于导入文件。</p>
<h3 id="contract"><a href="#contract" class="headerlink" title="contract"></a>contract</h3><p>modifier:函数修饰器</p>
<p>event:方便调用EVM日志功能的接口</p>
<h3 id="导入其他源文件"><a href="#导入其他源文件" class="headerlink" title="导入其他源文件"></a>导入其他源文件</h3><p>Solidity 支持导入语句,以帮助模块化您的代码, 这些语句与 JavaScript 中可用的语句相似(从ES6开始)。 然而,Solidity 并不支持 <a target="_blank" rel="noopener" href="https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export#description">默认导出</a> 的概念。</p>
<h3 id="诠释"><a href="#诠释" class="headerlink" title="诠释"></a>诠释</h3><figure class="highlight plaintext"><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"></span><br><span class="line">/*</span><br><span class="line">这是一个</span><br><span class="line">多行注释。</span><br><span class="line">*/</span><br></pre></td></tr></table></figure>
<p>Solidity合约也可以包含NatSpec注释。 它们用三重斜线( ///)或双星号块( /** … */)来写, 它们应该直接用在函数声明或语句之上。<br>建议 Solidity 合约使用 NatSpec 对所有公共接口(ABI 中的一切)进行完全注释。</p>
<table>
<thead>
<tr>
<th>标签</th>
<th></th>
<th>应用于</th>
</tr>
</thead>
<tbody><tr>
<td><code>@title</code></td>
<td>一个应该描述合约/接口的标题</td>
<td>contract, library, interface</td>
</tr>
<tr>
<td><code>@author</code></td>
<td>作者的名字</td>
<td>contract, library, interface</td>
</tr>
<tr>
<td><code>@notice</code></td>
<td>向终端用户解释这个东西的作用</td>
<td>contract, library, interface, function, public state variable, event</td>
</tr>
<tr>
<td><code>@dev</code></td>
<td>向开发人员解释任何额外的细节</td>
<td>contract, library, interface, function, state variable, event</td>
</tr>
<tr>
<td><code>@param</code></td>
<td>就像在Doxygen中一样记录一个参数(必须在参数名之后)</td>
<td>function, event</td>
</tr>
<tr>
<td><code>@return</code></td>
<td>记录一个合约的函数的返回变量</td>
<td>function, public state variable</td>
</tr>
<tr>
<td><code>@inheritdoc</code></td>
<td>从基本函数中复制所有缺失的标签(必须在合约名称之后)</td>
<td>function, public state variable</td>
</tr>
<tr>
<td><code>@custom:...</code></td>
<td>自定义标签,语义由应用程序定义</td>
<td>everywhere</td>
</tr>
</tbody></table>
<h2 id="子货币(Subcurrency)例子"><a href="#子货币(Subcurrency)例子" class="headerlink" title="子货币(Subcurrency)例子"></a>子货币(Subcurrency)例子</h2><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">// SPDX-License-Identifier: GPL-3.0</span><br><span class="line">pragma solidity ^0.8.4;</span><br><span class="line"></span><br><span class="line">contract Coin {</span><br><span class="line"> // 关键字 "public" 使变量可以从其他合约中访问。</span><br><span class="line"> address public minter;</span><br><span class="line"> mapping(address => uint) public balances;</span><br><span class="line"></span><br><span class="line"> // 事件允许客户端对您声明的特定合约变化做出反应</span><br><span class="line"> event Sent(address from, address to, uint amount);</span><br><span class="line"></span><br><span class="line"> // 构造函数代码只有在合约创建时运行</span><br><span class="line"> constructor() {</span><br><span class="line"> minter = msg.sender;</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"> function mint(address receiver, uint amount) public {</span><br><span class="line"> require(msg.sender == minter);</span><br><span class="line"> balances[receiver] += amount;</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"> error InsufficientBalance(uint requested, uint available);</span><br><span class="line"></span><br><span class="line"> // 从任何调用者那里发送一定数量的代币到一个地址</span><br><span class="line"> function send(address receiver, uint amount) public {</span><br><span class="line"> if (amount > balances[msg.sender])</span><br><span class="line"> revert InsufficientBalance({</span><br><span class="line"> requested: amount,</span><br><span class="line"> available: balances[msg.sender]</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"> balances[msg.sender] -= amount;</span><br><span class="line"> balances[receiver] += amount;</span><br><span class="line"> emit Sent(msg.sender, receiver, amount);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p> <code>address</code> 类型是一个160位的值,且不允许任何算数操作。 这种类型适合存储合约地址或 <a target="_blank" rel="noopener" href="https://docs.soliditylang.org/zh-cn/latest/introduction-to-smart-contracts.html#accounts">外部账户</a> 的密钥对</p>
<h2 id="Solidity-的两种主要存储类型"><a href="#Solidity-的两种主要存储类型" class="headerlink" title="Solidity 的两种主要存储类型"></a>Solidity 的两种主要存储类型</h2><p><strong>内存 (Memory)</strong> 和 **存储 (Storage)**。</p>
<h1 id="class1"><a href="#class1" class="headerlink" title="class1"></a>class1</h1><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">mkdir firstcontract</span><br><span class="line"></span><br><span class="line">cd firstcontract</span><br><span class="line"></span><br><span class="line">yarn init -y</span><br><span class="line"></span><br><span class="line">yarn add -D hardhat</span><br><span class="line"></span><br><span class="line">npx hardhat</span><br></pre></td></tr></table></figure>
<p><strong><code>yarn init -y</code></strong>:<br>这个命令会初始化一个新的Node.js项目,创建一个<code>package.json</code>文件。<code>-y</code>选项意味着自动接受所有默认配置,而不需要用户交互。</p>
<p><strong><code>yarn add -D hardhat</code></strong>:<br>这个命令将Hardhat作为开发依赖(<code>-D</code>等同于<code>--dev</code>)添加到项目中。Hardhat是一个用于智能合约开发、测试和部署的开发框架,通常用于以太坊相关的项目。</p>
<p><strong><code>npx hardhat</code></strong>:<br>这个命令用于运行Hardhat的命令行工具。<code>npx</code>是一个包管理器工具,它会自动找到项目中安装的<code>hardhat</code>并执行。常用于运行Hardhat脚本或启动开发环境。如果你运行<code>npx hardhat</code>,通常会看到Hardhat的帮助信息,或者它会启动一个新的Hardhat项目。</p>
<p>Hardhat:合约审计机构,编译部署合约到任意以太坊网络的框架</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx hardhat compile</span><br></pre></td></tr></table></figure>
<p>内部的版本需要改在内部的那个合约版本之上hardhat.config.js,版本需要一样pragma</p>
<h2 id="项目结构介绍"><a href="#项目结构介绍" class="headerlink" title="项目结构介绍"></a>项目结构介绍</h2><p>contracts:合约,solidity文件编写</p>
<p>scripts:部署的脚本</p>
<p>ignition: module,lock.js:部署合约的官方的脚本,合约失败的时候回滚</p>
<p>test文件夹,生成test脚本</p>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2025/01/21/solidity%E5%85%A5%E9%97%A81/" data-id="cm66hbvzd0000fou78idz9ofc" data-title="solidity入门1" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/solidity%E5%85%A5%E9%97%A8/" rel="tag">solidity入门</a></li></ul>
</footer>
</div>
</article>
<article id="post-2024126-solana流动性质押" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/01/06/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/" class="article-date">
<time class="dt-published" datetime="2025-01-06T03:50:35.000Z" itemprop="datePublished">2025-01-06</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/01/06/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/">solana流动性质押</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="Solana-质押-进行流动性质押"><a href="#Solana-质押-进行流动性质押" class="headerlink" title="Solana 质押 - 进行流动性质押"></a>Solana 质押 - 进行流动性质押</h1><p>使用质押账户质押</p>
<p>切换身份</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">solana config set -k ./user.json</span><br><span class="line"></span><br><span class="line">solana address -k user.json</span><br><span class="line"></span><br><span class="line">solana airdrop 100 <ADDRESS></span><br></pre></td></tr></table></figure>
<p>使用新身份进行质押 质押stake account</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">solana create-stake-account stake-account.json 100</span><br><span class="line"></span><br><span class="line">solana delegate-stake stake-account.json <VOTE_ACCOUNT></span><br><span class="line"></span><br><span class="line">spl-stake-pool deposit-stake <POOL_ADDRESS> <STAKE_ACCOUNT_ADDRESS> [ADDRESS]</span><br></pre></td></tr></table></figure>
<h2 id="实操"><a href="#实操" class="headerlink" title="实操"></a>实操</h2><h3 id="创建新的身份,用新的身份进行质押"><a href="#创建新的身份,用新的身份进行质押" class="headerlink" title="创建新的身份,用新的身份进行质押"></a>创建新的身份,用新的身份进行质押</h3><p>创建新的公私钥</p>
<figure class="highlight plaintext"><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">solana-keygen new --no-passphrase -s -o user.json</span><br><span class="line"></span><br><span class="line">solana address -k user.json</span><br></pre></td></tr></table></figure>
<p><code>-s</code> 或 <code>--silent</code>:静默模式,表示不会显示生成的密钥对(私钥)或其他详细信息,只会输出成功或失败信息。</p>
<p><code>-o user.json</code>:指定生成的密钥对文件的输出路径和文件名。在此例中,密钥对将被保存为 <code>user.json</code> 文件。</p>
<p><code>-k user.json</code>:指定包含密钥对的文件。此处 <code>user.json</code> 文件是由前一个命令生成的密钥对文件。</p>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana address -k user.json</span><br><span class="line">FgqRfnCeSFzfm4WtM9hvU1wBJmKFDSM7xQLVoZfYUxQH</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana config set -k ./user.json</span><br></pre></td></tr></table></figure>
<p>结果</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">Config File: /root/.config/solana/cli/config.yml</span><br><span class="line">RPC URL: http://127.0.0.1:8899</span><br><span class="line">WebSocket URL: ws://127.0.0.1:8900/ (computed)</span><br><span class="line">Keypair Path: ./user.json</span><br><span class="line">Commitment: confirmed</span><br></pre></td></tr></table></figure>
<h3 id="创建质押账户"><a href="#创建质押账户" class="headerlink" title="创建质押账户"></a>创建质押账户</h3><figure class="highlight plaintext"><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">solana create-stake-account stake-account.json 100</span><br><span class="line"></span><br><span class="line">Stake account DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9 already exists</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana create-stake-account stake-account.json 100</span><br><span class="line"></span><br><span class="line">Signature: 3w8pqwzsKhz9rTB1av42eK28acXTSFCEjqpx9My8PGByq4auCc8ddTayPnFSNyrNj4aCrgkFueWKCFyxw6JD1fTg</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana address -k stake-account.json </span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v 3U1evQ2sVKV4r8msGMV9djPPR63GphC42R8ZLrwQBLan</span><br></pre></td></tr></table></figure>
<p>继续</p>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# netstat -tuln | grep 9900</span><br><span class="line">tcp 0 0 0.0.0.0:9900 0.0.0.0:*</span><br><span class="line"> LISTEN</span><br><span class="line">LAPTOP-6M4RE4LA# sudo lsof -i :9900</span><br><span class="line">COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">solana-te 5489 root 16u IPv4 21090 0t0 TCP *:9900 (LISTEN)</span><br><span class="line">LAPTOP-6M4RE4LA# sudo kill -9 5489</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash setup-test-validator.sh --rpc-port 8899</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="中断后重新做"><a href="#中断后重新做" class="headerlink" title="中断后重新做"></a>中断后重新做</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana stake-account stake-account.json</span><br></pre></td></tr></table></figure>
<p>显示了与你提供的 <strong>staking 账户</strong> 相关的信息。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana validators -u localhost</span><br></pre></td></tr></table></figure>
<p>列出本地运行的 Solana 节点中的所有验证节点的信息。</p>
<figure class="highlight plaintext"><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">sudo lsof -i :9900</span><br><span class="line"></span><br><span class="line">sudo kill -9 <PID></span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">solana-test-validator \</span><br><span class="line"> --clone-upgradeable-program SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy \</span><br><span class="line"> --clone-upgradeable-program metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s \</span><br><span class="line"> --url mainnet-beta \</span><br><span class="line"> --slots-per-epoch 32 \</span><br><span class="line"> --quiet --reset</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# spl-stake-pool create-pool \</span><br><span class="line"> --epoch-fee-denominator 100 \</span><br><span class="line"> --epoch-fee-numerator 2 \</span><br><span class="line"> --max-validators 10 \</span><br><span class="line"> --withdrawal-fee-denominator 1000 \</span><br><span class="line"> --withdrawal-fee-numerator 1 \</span><br><span class="line"> --deposit-fee-numerator 3 \</span><br><span class="line"> --deposit-fee-denominator 1000 \</span><br><span class="line"> --referral-fee 0</span><br><span class="line">Creating reserve stake JC3voDWUtW3S6nrj8tfwkQHrA8puFNrUfEhE1BkLz2hR</span><br><span class="line">Creating mint BdASXCzyzUuuyNPndbyEAM85rS76zQKsfWLSpRyBLeCN</span><br><span class="line">Creating associated token account AegGHE5zHqzGdt6RSPs3kNF7qeBaFgiGe3NoC1v2GhGF to receive stake pool tokens of mint BdASXCzyzUuuyNPndbyEAM85rS76zQKsfWLSpRyBLeCN, owned by FgqRfnCeSFzfm4WtM9hvU1wBJmKFDSM7xQLVoZfYUxQH</span><br><span class="line">Creating pool fee collection account AegGHE5zHqzGdt6RSPs3kNF7qeBaFgiGe3NoC1v2GhGF</span><br><span class="line">Setting up required accounts for stake pool: reserve stake JC3voDWUtW3S6nrj8tfwkQHrA8puFNrUfEhE1BkLz2hR and mint BdASXCzyzUuuyNPndbyEAM85rS76zQKsfWLSpRyBLeCN</span><br><span class="line">Signature: 4Rbedgpdp25vR4XU6fhdHN96DQWwCnJs6nRGuFGWSM1Lm8nwx7vsMkcGBhVSRc9GVrHQFkzVCa4i92e7VVZkb1YA</span><br><span class="line">Creating stake pool B7bvmYLxcH7oBvJ5jafGoX72tvMhvNh7sNagupbbja4K with validator list 9VVY8VKhw54XyVfiPcsiTAiUkjdamDsiqY2DA3eXsQyA</span><br><span class="line">Signature: 4H7UcU39z2MNojPFhA4ozm3JPT67ZRjdv8rQ7ytfwowff6uvuEj1HMv4RxtwQ4PktHmaatQ7K9sjE7vaqDRLEvFh</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">solana create-stake-account stake-account.json 100 </span><br><span class="line"></span><br><span class="line">solana stake-account stake-account.json</span><br><span class="line"></span><br><span class="line">solana delegate-stake stake-account.json <VOTE_ACCOUNT> </span><br></pre></td></tr></table></figure>
<h3 id="中断"><a href="#中断" class="headerlink" title="中断"></a>中断</h3><figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# spl-stake-pool create-pool \</span><br><span class="line"> --epoch-fee-denominator 100 \</span><br><span class="line"> --epoch-fee-numerator 2 \</span><br><span class="line"> --max-validators 10 \</span><br><span class="line"> --withdrawal-fee-denominator 1000 \</span><br><span class="line"> --withdrawal-fee-numerator 1 \</span><br><span class="line"> --deposit-fee-numerator 3 \</span><br><span class="line"> --deposit-fee-denominator 1000 \</span><br><span class="line"> --referral-fee 0</span><br><span class="line">Creating reserve stake 2qPwU5H324GU5ev3xPumZQ6ar65SUzcTke4mKZfjz1Rz</span><br><span class="line">Creating mint G2VpfF5rgDESRQDFhrB4aPR65ajDLgPoX3SBQkQnU2V9</span><br><span class="line">Creating associated token account BniPHuiEQtoTewuPLg7kZ7i44S95vjFSgb4FYzHS2Dnq to receive stake pool tokens of mint G2VpfF5rgDESRQDFhrB4aPR65ajDLgPoX3SBQkQnU2V9, owned by FgqRfnCeSFzfm4WtM9hvU1wBJmKFDSM7xQLVoZfYUxQH</span><br><span class="line">Creating pool fee collection account BniPHuiEQtoTewuPLg7kZ7i44S95vjFSgb4FYzHS2Dnq</span><br><span class="line">Setting up required accounts for stake pool: reserve stake 2qPwU5H324GU5ev3xPumZQ6ar65SUzcTke4mKZfjz1Rz and mint G2VpfF5rgDESRQDFhrB4aPR65ajDLgPoX3SBQkQnU2V9</span><br><span class="line">Signature: 1i8ujLqfyVSCchkcfKPguatHpSJy4bRCEoDTd221f9btcjU9ft6MBf1kRtfNUv2SbJdLo3KXDom7WXsMrSEjyz1</span><br><span class="line">Creating stake pool DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd with validator list Dr1qzgA1wACEBWYearMh8DhuGpsrTw1zAsMsb9bSmBA5</span><br><span class="line">Signature: 3Kqx6J8X8ce4iVc2JgaPhazPqniaPX4kZKp4pnie8oVGHAkr6p37ikygCMfeB1B4MURnVq4RWRyTEx3LmnaNJkPo</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">LAPTOP-6M4RE4LA# solana create-stake-account stake-account.json 100</span><br><span class="line"></span><br><span class="line">Signature: yP8kRxNru7dNhhpTnhkgC1YX5NEFTKh4r47syFRePVt5EA3tW45FtCCjLrAV3TBRY5ZiGq7zQPWTB9umkrs2PQF</span><br><span class="line"></span><br><span class="line">LAPTOP-6M4RE4LA# solana stake-account stake-account.json</span><br><span class="line">Balance: 100 SOL</span><br><span class="line">Rent Exempt Reserve: 0.00228288 SOL</span><br><span class="line">Stake account is undelegated</span><br><span class="line">Stake Authority: FgqRfnCeSFzfm4WtM9hvU1wBJmKFDSM7xQLVoZfYUxQH</span><br><span class="line">Withdraw Authority: FgqRfnCeSFzfm4WtM9hvU1wBJmKFDSM7xQLVoZfYUxQH</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana validators -u localhost</span><br></pre></td></tr></table></figure>
<p>投票账户</p>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana vote-account Dr1qzgA1wACEBWYearMh8DhuGpsrTw1zAsMsb9bSmBA5</span><br><span class="line">Error: RPC request error: Dr1qzgA1wACEBWYearMh8DhuGpsrTw1zAsMsb9bSmBA5 is not a vote account</span><br><span class="line">LAPTOP-6M4RE4LA# solana validators -u localhost</span><br><span class="line"> Identity Vote Account Commission Last Vote Root Slot Skip Rate Credits Version Active Stake</span><br><span class="line"> DybpMkusrw1eoWtUbbgF9VXtVNPbfspwpqe6VGihiRpt Do7A4xo568x6bFjP9sAUZA7xEMLXoro9oXx99X2G1Nwb 0% 15585 ( 0) 15554 ( 0) 0.00% 0 2.0.21 1007535.805667599 SOL (100.00%)</span><br><span class="line"></span><br><span class="line">Average Stake-Weighted Skip Rate: 0.00%</span><br><span class="line">Average Unweighted Skip Rate: 0.00%</span><br><span class="line"></span><br><span class="line">Active Stake: 1007535.805667599 SOL</span><br><span class="line"></span><br><span class="line">Stake By Version:</span><br><span class="line">2.0.21 - 1 current validators (100.00%)</span><br></pre></td></tr></table></figure>
<p><code>solana validators -u localhost</code> 输出的信息中包括了每个验证器的 <strong>投票账户</strong>。在这个输出中,<code>Vote Account</code> 列显示了每个验证器的投票账户地址。</p>
<p><strong>Identity</strong>:验证器的身份公钥(<code>DybpMkusrw1eoWtUbbgF9VXtVNPbfspwpqe6VGihiRpt</code>)。</p>
<p><strong>Vote Account</strong>:验证器的投票账户公钥(<code>Do7A4xo568x6bFjP9sAUZA7xEMLXoro9oXx99X2G1Nwb</code>)。</p>
<p><strong>Commission</strong>:验证器的佣金比例(0%)。</p>
<p><strong>Last Vote</strong>:验证器的最后投票的插槽号。</p>
<p><strong>Root Slot</strong>:验证器的根插槽号。</p>
<p><strong>Skip Rate</strong>:跳过的比例,表示验证器错过的块。</p>
<p><strong>Credits</strong>:该验证器的积分。</p>
<p><strong>Version</strong>:验证器的版本(2.0.21)。</p>
<p><strong>Active Stake</strong>:该验证器当前的活跃质押金额(1007535.805667599 SOL)</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool add-validator DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd </span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v </span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool deposit-stake <POOL_ADDRESS> <STAKE_ACCOUNT_ADDRESS> [ADDRESS]</span><br></pre></td></tr></table></figure>
<p>质押大头给的账户是vote账户的stake账户</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool update DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana epoch-info</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">spl-stake-pool withdraw-stake <POOL_ADDRESS> <AMOUNT></span><br><span class="line"> # --stake-receiver <STAKE_ACCOUNT_ADDRESS> # 要接收的stake account,不指定的话会创建新的</span><br><span class="line"> # --vote-account <VOTE_ACCOUNT_ADDRESS> # 默认会从最多余额的validator中提现</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool set-manager [FLAGS] [OPTIONS] <POOL_ADDRESS> <--new-manager <KEYPAIR>|--new-fee-receiver <ADDRESS>></span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# spl-stake-pool set-manager DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd --new-fee-receiver 7X35hqh5KEJCKFWpaaSyRKH14UdkvLZJjNC74VdJK5V4</span><br><span class="line">Signature: jUJsdx8C1qy1Xkz8Hu7DYLFB54zdBizzUdE7xFCZjhpogSDqu1ZPx9xzdA553z3HAQdYKFnfL3G6gvCgK8YSNuP</span><br><span class="line">Signature: 5XSHZ414uqjjXZtt28JXfPFXczUiHN4xWZEt6sij6ZRLVik3t8y3q3Y9iWDCLnAstGZhPAAcZp6n421nMHuGCUqn</span><br><span class="line">thread 'main' panicked at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/spl-token-6.0.0/src/state.rs:136:19:</span><br><span class="line">range end index 165 out of range for slice of length 0</span><br><span class="line">note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool deposit-sol DZMUF9fwka2fsAQoKryB1sV56ZyWo2qmdReUhj52JnVd <amount></span><br></pre></td></tr></table></figure>
<p><img src="E:/hexo/blog/source/imgs/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/image-20250109233618254.png" alt="image-20250109233618254"></p>
<h2 id="配置改后"><a href="#配置改后" class="headerlink" title="配置改后"></a>配置改后</h2><p>通过质押账户质押</p>
<figure class="highlight plaintext"><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">solana airdrop 1.3 Ej8hP4BVoX7pYvJXfmcqn7Pz3KSWmsyRKaR36fA6uYy1<reverse account ></span><br><span class="line">spl-stake-pool add-validator 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF<pool> ABUR3WFro1gARq7HgBbLMCe3fttNzZZTQBmqdnGB3AyN<vote></span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">solana-keygen new --no-passphrase -s -o user.json</span><br><span class="line"></span><br><span class="line">solana config set -k ./user.json</span><br><span class="line"></span><br><span class="line">solana create-stake-account stake-account.json 90</span><br><span class="line"></span><br><span class="line">solana delegate-stake stake-account.json ABUR3WFro1gARq7HgBbLMCe3fttNzZZTQBmqdnGB3AyN</span><br><span class="line"></span><br><span class="line">spl-stake-pool deposit-stake [FLAGS] [OPTIONS] <POOL_ADDRESS> <STAKE_ACCOUNT_ADDRESS> [ADDRESS]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">spl-stake-pool deposit-stake [FLAGS] [OPTIONS] <POOL_ADDRESS> <STAKE_ACCOUNT_ADDRESS> [ADDRESS]</span><br><span class="line"></span><br><span class="line">spl-stake-pool deposit-stake 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF EAp1qih1E94fSfeZDLtfQgrLNzg5uLxi7XcMyAvdEhx8</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">solana epoch-info</span><br><span class="line">spl-stake-pool update 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">spl-stake-pool withdraw-stake <POOL_ADDRESS> <AMOUNT></span><br><span class="line"> # --stake-receiver <STAKE_ACCOUNT_ADDRESS> # 要接收的stake account,不指定的话会创建新的</span><br><span class="line"> # --vote-account <VOTE_ACCOUNT_ADDRESS> # 默认会从最多余额的validator中提现</span><br></pre></td></tr></table></figure>
<p>直接往质押池质押</p>
<figure class="highlight plaintext"><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">spl-stake-pool deposit-sol <YOUR_STAKE_POOL_ADDRESS> <amount></span><br><span class="line"></span><br><span class="line">spl-stake-pool deposit-sol 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF 9</span><br></pre></td></tr></table></figure>
<p><img src="E:/hexo/blog/source/imgs/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/image-20250110005423358.png" alt="image-20250110005423358"></p>
<figure class="highlight plaintext"><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">solana config set -k /root/.config/solana/id.json</span><br><span class="line"></span><br><span class="line">spl-stake-pool increase-validator-stake -h</span><br><span class="line"></span><br><span class="line">spl-stake-pool increase-validator-stake [FLAGS] [OPTIONS] <POOL_ADDRESS> <VOTE_ACCOUNT_ADDRESS> [AMOUNT]</span><br><span class="line"></span><br><span class="line">spl-stake-pool decrease-validator-stake [FLAGS] [OPTIONS] <POOL_ADDRESS> <VOTE_ACCOUNT_ADDRESS> [AMOUNT]</span><br></pre></td></tr></table></figure>
<p>命令用于 <strong>增加验证人</strong> 在 <strong>Solana Stake Pool</strong> 中的 <strong>质押金额</strong>。</p>
<p>命令用于 <strong>减少验证人</strong> 在 <strong>Solana Stake Pool</strong> 中的 <strong>质押金额</strong>。</p>
<p>钱进入</p>
<p>Transient Stake Account: 82aX3df3vMzA3ZeGSbc7bnQoMnREuSU1cnCgNSLws7Kg</p>
<p>下一个周期epoch触发</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool update 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF</span><br></pre></td></tr></table></figure>
<p>提现</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana config set -k ./user.json</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">spl-stake-pool withdraw-sol</span><br><span class="line"></span><br><span class="line">spl-stake-pool withdraw-sol [FLAGS][OPTIONS] <POOL_ADDRESS> <SYSTEM_ACCOUNT_ADDRESS_OR_KEYPAIR> <AMOUNT></span><br></pre></td></tr></table></figure>
<p>spl-stake-poool with withdraw-sol直接提现SOL,直接体现的话是从reverse中体现的</p>
<p>spl-stake-poool with withdraw-stake 提现到stake</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool withdraw-sol 2K4r9Fv2n62NArPuyxGdNVL7QYwrNsPVWPTthGR4PZXF ./user.json 18</span><br></pre></td></tr></table></figure>
<p><img src="E:/hexo/blog/source/imgs/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/image-20250110012630625.png" alt="image-20250110012630625"></p>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2025/01/06/2024126-solana%E6%B5%81%E5%8A%A8%E6%80%A7%E8%B4%A8%E6%8A%BC/" data-id="cm5r2i69e00034su72ihfek8u" data-title="solana流动性质押" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SOLANA%E9%A1%B9%E7%9B%AE%E5%85%A5%E9%97%A82-anchor/" rel="tag">SOLANA项目入门2---anchor</a></li></ul>
</footer>
</div>
</article>
<article id="post-2024129-github的使用" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2024/12/09/2024129-github%E7%9A%84%E4%BD%BF%E7%94%A8/" class="article-date">
<time class="dt-published" datetime="2024-12-09T02:23:47.000Z" itemprop="datePublished">2024-12-09</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/12/09/2024129-github%E7%9A%84%E4%BD%BF%E7%94%A8/">github的使用</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h2 id="提交github"><a href="#提交github" class="headerlink" title="提交github"></a>提交github</h2><p>如果你已经解决了子模块问题,或者你不需要 <code>cli/</code> 作为子模块,并且已经进行了一些提交,那么你可以按照以下步骤继续推送到 GitHub 仓库。</p>
<p>问题</p>
<figure class="highlight plaintext"><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">fatal: detected dubious ownership in repository at '//wsl.localhost/Ubuntu-22.04/root/class/cli'</span><br><span class="line">To add an exception for this directory, call:</span><br></pre></td></tr></table></figure>
<p>解决:如果信任</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu-22.04/root/class/cli'</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm -rf counter/.git</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">git add -f cli/ counter/ friend-cli/ friend/ ibuidl_social/ token/</span><br><span class="line"></span><br><span class="line">git status</span><br><span class="line"></span><br><span class="line">git pull origin main</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="步骤:"><a href="#步骤:" class="headerlink" title="步骤:"></a>步骤:</h3><ol>
<li><p><strong>确认已初始化 Git 仓库</strong>: 确保你在正确的目录下,并且已经初始化了 Git 仓库。如果还没有初始化,运行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>添加远程仓库</strong>: 如果你还没有添加远程仓库,可以运行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin https://github.com/Auo578/solanapractical.git</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>切换并重命名为 <code>main</code> 分支</strong>: 如果你还没有切换到 <code>main</code> 分支或重命名分支,可以运行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -M main</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>添加所有文件到暂存区</strong>: 运行以下命令将所有文件添加到 Git 暂存区:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br></pre></td></tr></table></figure>
<p>确保你解决了所有子模块问题,或者删除了不必要的 <code>.git</code> 文件夹,确保所有文件都可以被添加。</p>
</li>
<li><p><strong>提交更改</strong>: 提交你的更改:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m <span class="string">"Initial commit"</span></span><br></pre></td></tr></table></figure>
<p>这个命令会把所有已添加的文件(包括修复后的 <code>cli/</code> 目录)提交到本地仓库。</p>
</li>
<li><p><strong>推送到 GitHub 仓库</strong>: 推送你的 <code>main</code> 分支到远程 GitHub 仓库:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -u origin main</span><br></pre></td></tr></table></figure>
<p>这个命令会将本地的 <code>main</code> 分支推送到远程 GitHub 仓库,并将远程仓库的 <code>origin</code> 设置为上游(<code>-u</code> 参数)。</p>
</li>
</ol>
<h3 id="总结:"><a href="#总结:" class="headerlink" title="总结:"></a>总结:</h3><ul>
<li><strong>添加远程仓库</strong>:<code>git remote add origin https://github.com/Auo578/solana-practice.git</code></li>
<li>**切换并重命名分支为 <code>main</code>**:<code>git branch -M main</code></li>
<li><strong>添加并提交文件</strong>:<code>git add .</code> 和 <code>git commit -m "Initial commit"</code></li>
<li><strong>推送到远程仓库</strong>:<code>git push -u origin main</code></li>
</ul>
<p>这些步骤应该能解决问题并将本地的代码推送到远程仓库。如果有任何问题,请继续提问!</p>
<h2 id="删除文件"><a href="#删除文件" class="headerlink" title="删除文件"></a>删除文件</h2><p>在执行 <code>git rm --cached</code> 时,路径应该是文件相对于当前 Git 仓库的路径,而不是绝对路径。如果您在 Git Bash 或 WSL 中,路径应该遵循 Git 仓库中的相对路径,而不是 Windows 系统中的路径。</p>
<p>从您的提示信息 <code>xiang@LAPTOP-6M4RE4LA MINGW64 //wsl.localhost/Ubuntu-22.04/root/class/cli (main)</code> 看,您的当前工作目录是 <code>//wsl.localhost/Ubuntu-22.04/root/class/cli</code>,这是 WSL 下的路径。</p>
<h3 id="1-确认当前路径"><a href="#1-确认当前路径" class="headerlink" title="1. 确认当前路径"></a>1. <strong>确认当前路径</strong></h3><p>您现在位于 <code>cli</code> 目录中,这意味着如果要删除 <code>cli</code> 目录中的文件,您只需要提供相对路径。例如,假设您想删除 <code>cli</code> 目录下的 <code>test.txt</code> 文件,路径应该是相对于 <code>cli</code> 目录的路径。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> --cached test.txt</span><br></pre></td></tr></table></figure>
<p>如果您在 <code>cli</code> 目录下,路径 <code>test.txt</code> 就是该目录下的文件。如果您想删除 <code>cli</code> 目录外的文件,则需要从仓库根目录开始写相对路径。</p>
<h3 id="2-删除-cli-目录中的文件"><a href="#2-删除-cli-目录中的文件" class="headerlink" title="2. 删除 cli 目录中的文件"></a>2. <strong>删除 <code>cli</code> 目录中的文件</strong></h3><p>如果您想删除整个 <code>cli</code> 目录中的所有文件,并且保留它们在本地文件系统中(即仅从 Git 中删除),您可以使用:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> --cached -r *</span><br></pre></td></tr></table></figure>
<p>这将删除 <code>cli</code> 目录下的所有文件(不包括 <code>.git</code> 文件夹)。</p>
<h3 id="3-从父目录删除-cli-目录"><a href="#3-从父目录删除-cli-目录" class="headerlink" title="3. 从父目录删除 cli 目录"></a>3. <strong>从父目录删除 <code>cli</code> 目录</strong></h3><p>如果您要删除整个 <code>cli</code> 目录(以及它的所有内容)并推送到远程仓库,您可以使用相对路径,如下所示:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> --cached -r cli</span><br></pre></td></tr></table></figure>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><ul>
<li>如果您在 <code>cli</code> 目录中,使用相对路径 <code>git rm --cached test.txt</code>。</li>
<li>如果您想删除整个 <code>cli</code> 目录,使用 <code>git rm --cached -r cli</code>。</li>
<li>确保使用相对路径而不是绝对路径。</li>
</ul>
<p>要删除 GitHub 上的文件,您可以通过 Git 来删除它们,然后将更改推送到 GitHub。以下是详细步骤:</p>
<h3 id="1-删除本地文件"><a href="#1-删除本地文件" class="headerlink" title="1. 删除本地文件"></a>1. <strong>删除本地文件</strong></h3><p>首先,删除本地仓库中的文件。您可以通过 <code>git rm</code> 命令来删除文件:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> path/to/file</span><br></pre></td></tr></table></figure>
<p>其中,<code>path/to/file</code> 是您要删除的文件的相对路径。如果要删除整个目录及其内容,可以使用 <code>-r</code> 选项:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> -r path/to/directory</span><br></pre></td></tr></table></figure>
<p>如果您只是想删除文件,并保留文件在本地系统上的副本,可以使用 <code>--cached</code> 选项:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> --cached path/to/file</span><br></pre></td></tr></table></figure>
<h3 id="2-提交删除操作"><a href="#2-提交删除操作" class="headerlink" title="2. 提交删除操作"></a>2. <strong>提交删除操作</strong></h3><p>删除文件后,您需要提交删除操作:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m <span class="string">"Delete file or directory"</span></span><br></pre></td></tr></table></figure>
<h3 id="3-推送更改到-GitHub"><a href="#3-推送更改到-GitHub" class="headerlink" title="3. 推送更改到 GitHub"></a>3. <strong>推送更改到 GitHub</strong></h3><p>然后,您将删除的更改推送到 GitHub:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure>
<p><code>main</code> 是您的当前分支名称,如果您使用的是其他分支,请替换为相应的分支名称。</p>
<h3 id="示例:删除文件并推送更改"><a href="#示例:删除文件并推送更改" class="headerlink" title="示例:删除文件并推送更改"></a>示例:删除文件并推送更改</h3><p>假设您想删除 GitHub 上的 <code>test.txt</code> 文件,您可以按以下步骤操作:</p>
<ol>
<li><p><strong>删除文件</strong>:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">rm</span> test.txt</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>提交删除操作</strong>:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m <span class="string">"Delete test.txt"</span></span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>推送到 GitHub</strong>:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="4-通过-GitHub-网站删除文件"><a href="#4-通过-GitHub-网站删除文件" class="headerlink" title="4. 通过 GitHub 网站删除文件"></a>4. <strong>通过 GitHub 网站删除文件</strong></h3><p>如果您不想使用命令行,也可以直接通过 GitHub 网站删除文件:</p>
<ol>
<li>进入您的仓库页面。</li>
<li>找到您要删除的文件。</li>
<li>点击文件名,进入文件详情页面。</li>
<li>点击右上角的铅笔图标(编辑按钮)。</li>
<li>在文件页面底部,选择 “Delete this file”。</li>
<li>在提交信息框中填写相关的说明,然后点击 “Commit changes”。</li>
</ol>
<p>这将直接从 GitHub 网站删除该文件,并提交更改。</p>
<h3 id="总结-1"><a href="#总结-1" class="headerlink" title="总结"></a>总结</h3><ul>
<li>使用 <code>git rm</code> 删除文件。</li>
<li>提交更改并推送到 GitHub。</li>
<li>也可以通过 GitHub 网站手动删除文件。</li>
</ul>
<p>通过这些步骤,您可以轻松地删除 GitHub 上的文件。</p>
<h2 id="上传某些除文件"><a href="#上传某些除文件" class="headerlink" title="上传某些除文件"></a>上传某些除文件</h2><p>如果你想上传除 <code>test-ledger/</code> 目录外的所有文件,以下是可以执行的步骤:</p>
<h3 id="1-使用-gitignore-来忽略-test-ledger-目录"><a href="#1-使用-gitignore-来忽略-test-ledger-目录" class="headerlink" title="1. 使用 .gitignore 来忽略 test-ledger/ 目录"></a>1. <strong>使用 <code>.gitignore</code> 来忽略 <code>test-ledger/</code> 目录</strong></h3><p>您可以通过 <code>.gitignore</code> 文件来排除 <code>test-ledger/</code> 目录,并确保 Git 跟踪其他目录中的文件。</p>
<h4 id="步骤:-1"><a href="#步骤:-1" class="headerlink" title="步骤:"></a>步骤:</h4><ol>
<li><p><strong>创建 <code>.gitignore</code> 文件(如果没有的话)</strong>: 如果仓库中还没有 <code>.gitignore</code> 文件,您可以创建一个:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">touch</span> .gitignore</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>在 <code>.gitignore</code> 中排除 <code>test-ledger/</code> 目录</strong>: 打开 <code>.gitignore</code> 文件,并添加以下内容:</p>
<figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">test-ledger/</span><br></pre></td></tr></table></figure>
<p>这将告诉 Git 忽略 <code>test-ledger/</code> 目录及其所有内容。</p>
</li>
<li><p><strong>添加并提交其他文件</strong>: 然后,您可以将其他文件添加到 Git 并提交它们。由于 <code>test-ledger/</code> 已被 <code>.gitignore</code> 忽略,Git 会跳过该目录:</p>
<figure class="highlight bash"><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">git add .</span><br><span class="line">git commit -m <span class="string">"Add all files except test-ledger"</span></span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>推送更改到 GitHub</strong>: 最后,推送您的更改到 GitHub:</p>
<figure class="highlight bash"><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 push origin main</span><br><span class="line"></span><br><span class="line">git push -f origin main</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="2-手动添加文件(不使用-gitignore)"><a href="#2-手动添加文件(不使用-gitignore)" class="headerlink" title="2. 手动添加文件(不使用 .gitignore)"></a>2. <strong>手动添加文件(不使用 <code>.gitignore</code>)</strong></h3><p>如果您不想修改 <code>.gitignore</code> 文件,也可以手动选择性地添加文件,而不包括 <code>test-ledger/</code> 目录。</p>
<h4 id="步骤:-2"><a href="#步骤:-2" class="headerlink" title="步骤:"></a>步骤:</h4><ol>
<li><p><strong>查看未跟踪的文件</strong>: 使用 <code>git status</code> 来查看当前未跟踪的文件:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure>
<p>结果显示:</p>
<figure class="highlight plaintext"><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">Untracked files:</span><br><span class="line">cli/</span><br><span class="line">counter/</span><br><span class="line">friend-cli/</span><br><span class="line">friend/</span><br><span class="line">ibuidl_social/</span><br><span class="line">test-ledger/</span><br><span class="line">token/</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>手动添加文件</strong>: 您可以手动选择性地添加其他目录中的文件(不包括 <code>test-ledger/</code> 目录):</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add cli/ counter/ friend-cli/ friend/ ibuidl_social/ token/</span><br></pre></td></tr></table></figure>
<p>这将添加所有其他目录中的文件,但排除了 <code>test-ledger/</code> 目录。</p>
</li>
<li><p><strong>提交并推送到 GitHub</strong>: 提交更改并将其推送到 GitHub:</p>
<figure class="highlight bash"><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">git commit -m <span class="string">"Add all files except test-ledger"</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="总结:-1"><a href="#总结:-1" class="headerlink" title="总结:"></a>总结:</h3><ul>
<li>**使用 <code>.gitignore</code>**:推荐使用 <code>.gitignore</code> 来忽略 <code>test-ledger/</code> 目录。</li>
<li><strong>手动添加文件</strong>:如果不想使用 <code>.gitignore</code>,可以手动选择性地添加文件。</li>
</ul>
<p>使用 <code>.gitignore</code> 更加方便,因为它可以帮助您在未来避免重复添加 <code>test-ledger/</code> 目录。如果有其他问题,随时告诉我!</p>
<h2 id="拉取远程仓库的更改"><a href="#拉取远程仓库的更改" class="headerlink" title="拉取远程仓库的更改"></a>拉取远程仓库的更改</h2><p>这个错误信息表明,远程仓库 <code>main</code> 分支包含了一些您本地没有的更改。为了解决这个问题,您需要先从远程仓库拉取最新的更改,再进行推送。</p>
<h3 id="解决步骤:"><a href="#解决步骤:" class="headerlink" title="解决步骤:"></a>解决步骤:</h3><ol>
<li><p><strong>拉取远程仓库的更改</strong>: 使用 <code>git pull</code> 拉取远程仓库的最新更改到本地,合并这些更改。假设您要拉取远程 <code>main</code> 分支:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin main</span><br></pre></td></tr></table></figure>
<p>这会将远程仓库的 <code>main</code> 分支上的更改合并到您本地的 <code>main</code> 分支中。如果有冲突,您需要解决这些冲突。</p>
</li>
<li><p><strong>解决冲突(如果有的话)</strong>: 如果拉取过程中出现冲突,Git 会提示您哪个文件有冲突。您需要手动解决冲突,然后执行以下命令标记冲突已解决:</p>
<figure class="highlight bash"><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">git add <resolved-file></span><br><span class="line">git commit</span><br></pre></td></tr></table></figure>
</li>
<li><p><strong>再次推送更改</strong>: 一旦您成功拉取并解决了任何冲突,您就可以将本地更改推送到远程仓库:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="其他情况"><a href="#其他情况" class="headerlink" title="其他情况"></a>其他情况</h3><ul>
<li><p>如果您希望强制推送</p>
<p>(小心使用):如果您确定本地更改是正确的,并且您希望覆盖远程仓库的更改,可以使用 </p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--force</span><br></pre></td></tr></table></figure>
<p> 强制推送,但这可能会导致丢失远程仓库的更改:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push --force origin main</span><br></pre></td></tr></table></figure>
<p>强制推送之前,请确保您了解可能的风险。</p>
</li>
</ul>
<h3 id="总结-2"><a href="#总结-2" class="headerlink" title="总结"></a>总结</h3><ol>
<li>先执行 <code>git pull origin main</code> 拉取远程更改。</li>
<li>解决任何冲突并提交解决后的文件。</li>
<li>最后推送更改。</li>
</ol>
<p>如果您遇到任何问题,随时告诉我!</p>
<p>如果您已经执行了 <code>git add</code> 来添加文件,但还没有提交(<code>git commit</code>),并且现在想要从暂存区移除文件,可以使用 <code>git reset</code> 命令。</p>
<h3 id="从暂存区移除已添加的文件"><a href="#从暂存区移除已添加的文件" class="headerlink" title="从暂存区移除已添加的文件"></a>从暂存区移除已添加的文件</h3><ol>
<li><p><strong>移除指定文件:</strong></p>
<p>如果您只想移除某个特定的文件或目录,可以使用:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset <file></span><br></pre></td></tr></table></figure>
<p>例如,要移除 <code>cli/</code> 文件夹,可以运行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset cli/</span><br></pre></td></tr></table></figure>
<p>这会将 <code>cli/</code> 从暂存区移除,但保留文件在工作区。</p>
</li>
<li><p><strong>移除所有已添加的文件:</strong></p>
<p>如果您想要移除所有已添加到暂存区的文件,可以使用:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset</span><br></pre></td></tr></table></figure>
<p>这会将所有文件从暂存区移除,但不会删除文件本身。文件仍然保留在您的工作目录中,只是不会被 Git 跟踪提交。</p>
</li>
</ol>
<h3 id="检查当前状态"><a href="#检查当前状态" class="headerlink" title="检查当前状态"></a>检查当前状态</h3><p>在移除文件后,您可以通过 <code>git status</code> 来查看当前的状态,确认文件已经从暂存区移除:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure>
<p>这时,文件应该会显示为 <strong>untracked</strong>(未跟踪的),而不是 <strong>staged</strong>(已暂存的)。</p>
<h3 id="总结-3"><a href="#总结-3" class="headerlink" title="总结"></a>总结</h3><ul>
<li>使用 <code>git reset <file></code> 移除特定文件。</li>
<li>使用 <code>git reset</code> 移除所有文件。</li>
<li>使用 <code>git status</code> 检查文件是否成功移除。</li>
</ul>
<p>这样,您就可以将已经添加到暂存区的文件撤回,而不会影响您的工作目录。</p>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2024/12/09/2024129-github%E7%9A%84%E4%BD%BF%E7%94%A8/" data-id="cm5r2i69i00094su7a000htq1" data-title="github的使用" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/program%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/" rel="tag">program工具使用</a></li></ul>
</footer>
</div>
</article>
<article id="post-2024126-social质押" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2024/12/06/2024126-social%E8%B4%A8%E6%8A%BC/" class="article-date">
<time class="dt-published" datetime="2024-12-06T03:50:35.000Z" itemprop="datePublished">2024-12-06</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/12/06/2024126-social%E8%B4%A8%E6%8A%BC/">solana质押</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="质押"><a href="#质押" class="headerlink" title="质押"></a>质押</h1><p>将sol或者其他token进行锁定,并赚取收益。</p>
<p><a target="_blank" rel="noopener" href="https://solanabeach.io/">https://solanabeach.io/</a></p>
<p>用户:赚取收益、参与共识网络</p>
<p>平台:POS网络中validator负责交易确认和区块制作,其权重由质押决定。二为通过控制质押收益控制token流动性,从而控制价值。</p>
<p>需要超过60%的权重</p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241216093751001.png" alt="image-20241216093751001"></p>
<p>网络级别的质押:solana官方开发的合约,原生合约(已经部署到solana的网络中),流动性质押。</p>
<p>应用级别的质押(用流动性质押的方式)</p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241216093952513.png" alt="image-20241216093952513"></p>
<p><a target="_blank" rel="noopener" href="https://solana.com/zh/docs/economics/staking">https://solana.com/zh/docs/economics/staking</a></p>
<p><a target="_blank" rel="noopener" href="https://docs.anza.xyz/">https://docs.anza.xyz/</a></p>
<p>POH:<a target="_blank" rel="noopener" href="https://www.blockchain-council.org/blockchain/what-is-proof-of-history-and-how-does-it-work/">https://www.blockchain-council.org/blockchain/what-is-proof-of-history-and-how-does-it-work/</a></p>
<p>论文:</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Blockchain_lemon/article/details/90631623">https://blog.csdn.net/Blockchain_lemon/article/details/90631623</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/u013288190/article/details/139650979">https://blog.csdn.net/u013288190/article/details/139650979</a></p>
<p>角色:</p>
<p>user wallet:通过质押账户进行质押</p>
<p>validator:validator通过vote account接收质押</p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241216133146240.png" alt="image-20241216133146240"></p>
<h2 id="质押方式"><a href="#质押方式" class="headerlink" title="质押方式"></a>质押方式</h2><p>1.钱包质押,phantom</p>
<p>2.native staking</p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241216142629612.png" alt="image-20241216142629612"></p>
<p><a target="_blank" rel="noopener" href="https://docs.anza.xyz/cli/examples/delegate-stake">https://docs.anza.xyz/cli/examples/delegate-stake</a></p>
<h2 id="实现native-staking"><a href="#实现native-staking" class="headerlink" title="实现native staking"></a>实现native staking</h2><p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241217091652949.png" alt="image-20241217091652949"></p>
<p>创建质押账户</p>
<figure class="highlight plaintext"><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">solana-test-validator</span><br><span class="line"></span><br><span class="line">课程</span><br><span class="line">solana-keygen new --no-passphrase -s -o stake-account</span><br><span class="line">.json</span><br><span class="line">网站</span><br><span class="line">solana-keygen new --no-passphrase -o stake-account.json</span><br></pre></td></tr></table></figure>
<p><code>solana-keygen new</code>:生成一个新的 Solana 密钥对。</p>
<p><code>--no-passphrase</code>:表示不设置密码保护,密钥将以明文形式存储在文件中。</p>
<p><code>-s</code>:指定使用 <strong><code>ed25519</code> seed phrase</strong>(种子短语)来生成密钥对。</p>
<p><code>-o stake-account.json</code>:指定将生成的密钥对存储在 <code>stake-account.json</code> 文件中。</p>
<p>用以下命令查看生成的密钥文件内容:cat stake-account.json</p>
<p>公钥和私钥的一个数组</p>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# cat stake-account.json</span><br><span class="line">[222,89,142,121,165,189,42,239,54,253,123,69,30,195,249,77,191,164,137,4,54,224,49,76,188,98,169,179,212,255,165,88,195,171,81,23,197,150,61,191,92,0,119,130,245,133,84,162,135,195,208,134,175,174,81,27,165,175,253,109,214,254,252,197]# </span><br></pre></td></tr></table></figure>
<p>查看公钥</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana address -k stake-account.json</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana address -k stake-account.json</span><br><span class="line">EAp1qih1E94fSfeZDLtfQgrLNzg5uLxi7XcMyAvdEhx8</span><br></pre></td></tr></table></figure>
<p><code>-k</code> 选项表示指定密钥文件的路径。</p>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana create-stake-account stake-account.json 100 --url localhost</span><br><span class="line"></span><br><span class="line">Signature: 5QwvDK41BU3ogm53Kfz1d5pPQf3x79sp9U2EnK7EoroNccNspZwjBCKfTDQEYAQqdYUpAjPeuM7PFuMWBNH1DpwP</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">LAPTOP-6M4RE4LA# solana validators -u localhost</span><br><span class="line"> Identity Vote Account Commission Last Vote Root Slot Skip Rate Credits Version Active Stake</span><br><span class="line"> HBU7uEtHykBaqmEk5sPHuZbUsBLC1r4LrAs3RkL5fkDV Hqe5qMfUtnc93FJk4QLUqG1ec2AuSNu2uH7R6hhi6ArD 0% 98226 ( 0) 98195 ( 0) 0.00% 1571069 2.1.4 999999.997717120 SOL (100.00%)</span><br><span class="line"></span><br><span class="line">Average Stake-Weighted Skip Rate: 0.00%</span><br><span class="line">Average Unweighted Skip Rate: 0.00%</span><br><span class="line"></span><br><span class="line">Active Stake: 999999.99771712 SOL</span><br><span class="line"></span><br><span class="line">Stake By Version:</span><br><span class="line">2.1.4 - 1 current validators (100.00%)</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">LAPTOP-6M4RE4LA# solana delegate-stake stake-account.json Hqe5qMfUtnc93FJk4QLUqG1ec2AuSNu2uH7R6hhi6ArD -u loca</span><br><span class="line">lhost</span><br><span class="line"></span><br><span class="line">Signature: 3JFdFVCFdzavdQrL415MzU7NJUNRLTQK3PCyxkRkx3AbhruJrwDZHA9VJDEwCc9q41sR6mwWndHz3Y4FYuzYZZsY</span><br><span class="line"></span><br><span class="line">LAPTOP-6M4RE4LA# solana stake-account stake-account.json</span><br><span class="line">Balance: 200 SOL</span><br><span class="line">Rent Exempt Reserve: 0.00228288 SOL</span><br><span class="line">Delegated Stake: 199.99771712 SOL</span><br><span class="line">Active Stake: 0 SOL</span><br><span class="line">Activating Stake: 199.99771712 SOL</span><br><span class="line">Stake activates starting from epoch: 0</span><br><span class="line">Delegated Vote Account Address: Hqe5qMfUtnc93FJk4QLUqG1ec2AuSNu2uH7R6hhi6ArD</span><br><span class="line">Stake Authority: DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9</span><br><span class="line">Withdraw Authority: DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# solana deactivate-stake stake-account.json -u localhost</span><br><span class="line"></span><br><span class="line">Signature: 62Ntvt9TGutHLznuXj2Ftjn7rVhuQbTpxev8nit7icLk1D8prQj6sTxQzVuXtXP6jCAEEnDLWRtmfCQ7uFzrPvqK</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">LAPTOP-6M4RE4LA# solana balance</span><br><span class="line">499999897.884810805 SOL</span><br><span class="line">LAPTOP-6M4RE4LA# solana withdraw-stake stake-account.json DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9 200 -u localhost</span><br><span class="line"></span><br><span class="line">Signature: 5XJpJ7K6awpuLrd1fxd5dx4WWa7dsRedmks4EdkZvucV6VYxHNNrMrAwE7RSfu2HK6mfWKNYv25EwxogbtLS6WcK</span><br><span class="line"></span><br><span class="line">LAPTOP-6M4RE4LA# solana balance</span><br><span class="line">500000097.884805799 SOL</span><br><span class="line">LAPTOP-6M4RE4LA# solana address</span><br><span class="line">DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9</span><br></pre></td></tr></table></figure>
<h2 id="如何实现native-staking"><a href="#如何实现native-staking" class="headerlink" title="如何实现native staking"></a>如何实现native staking</h2><p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221111125162.png" alt="image-20241221111125162"></p>
<h1 id="流动性质押介绍-质押池的创建"><a href="#流动性质押介绍-质押池的创建" class="headerlink" title="流动性质押介绍&质押池的创建"></a>流动性质押介绍&质押池的创建</h1><p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221120311748.png" alt="image-20241221120311748"></p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221120751914.png" alt="image-20241221120751914"></p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221123633522.png" alt="image-20241221123633522"></p>
<h3 id="管理员可以设置的费用类型:"><a href="#管理员可以设置的费用类型:" class="headerlink" title="管理员可以设置的费用类型:"></a>管理员可以设置的费用类型:</h3><p>sol deposit -> sol withdrawal</p>
<p>质押池直接质押sol,不经过质押账户</p>
<p>stake deposit</p>
<p>通过质押账户的费率 -> stake withdrawal</p>
<p>epoch</p>
<p>每个周期的费用(可以理解为管理费)</p>
<p>referral(介绍费)</p>
<p>拉人头返现</p>
<h2 id="创建质押池"><a href="#创建质押池" class="headerlink" title="创建质押池"></a>创建质押池</h2><p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221124314022.png" alt="image-20241221124314022"></p>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20241221124330066.png" alt="image-20241221124330066"></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool create-pool -h</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">spl-stake-pool create-pool \</span><br><span class="line"> --epoch-fee-denominator 100 \</span><br><span class="line"> --epoch-fee-numerator 2 \</span><br><span class="line"> --max-validators 10 \</span><br><span class="line"> --withdrawal-fee-denominator 1000 \</span><br><span class="line"> --withdrawal-fee-numerator 1 \</span><br><span class="line"> --deposit-fee-numerator 3 \</span><br><span class="line"> --deposit-fee-denominator 1000 \</span><br><span class="line"> --referral-fee 0</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v 《stake pool address》</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# spl-stake-pool create-pool \</span><br><span class="line"> --epoch-fee-denominator 100 \</span><br><span class="line"> --epoch-fee-numerator 2 \</span><br><span class="line"> --max-validators 10 \</span><br><span class="line"> --withdrawal-fee-denominator 1000 \</span><br><span class="line"> --withdrawal-fee-numerator 1 \</span><br><span class="line"> --deposit-fee-numerator 3 \</span><br><span class="line"> --deposit-fee-denominator 1000 \</span><br><span class="line"> --referral-fee 0</span><br><span class="line">Creating reserve stake UYNZbheLhARogFCddPhonmkpfA6cHqSYCWnqMxQQ8U5</span><br><span class="line">Creating mint 8m7MQ2NM5r7GqLKKwLjnXbQWJaWPEY5mSQgYFjGrFpL9</span><br><span class="line">Creating associated token account HpEvgWHHP9TkTXCMMoTiCif4gnFnQZRYDo592DZXdrDf to receive stake pool tokens of mint 8m7MQ2NM5r7GqLKKwLjnXbQWJaWPEY5mSQgYFjGrFpL9, owned by DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9</span><br><span class="line">Creating pool fee collection account HpEvgWHHP9TkTXCMMoTiCif4gnFnQZRYDo592DZXdrDf</span><br><span class="line">Setting up required accounts for stake pool: reserve stake UYNZbheLhARogFCddPhonmkpfA6cHqSYCWnqMxQQ8U5 and mint 8m7MQ2NM5r7GqLKKwLjnXbQWJaWPEY5mSQgYFjGrFpL9</span><br><span class="line">Signature: 5jtB33WXDmBsrja4QZHQJpNjvyreFtEGRKbgWFpoEWym4YaxrTrtU8WUSkaWE4Xogx6XmZVcTAkmmMWR9KF4Gi7f</span><br><span class="line">Creating stake pool 9rp9LaHqozHDsjCWTzLNkARaz3qUGzQM4QWcRTiuBP3J with validator list 4mLChLpwZsVXq6TnHaghTV5k9dQxxKiXqRDncxi4N7vo</span><br><span class="line">RPC response error -32002: Transaction simulation failed: Attempt to load a program that does not exist;</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">LAPTOP-6M4RE4LA# spl-stake-pool create-pool \</span><br><span class="line"> --epoch-fee-denominator 100 \</span><br><span class="line"> --epoch-fee-numerator 2 \</span><br><span class="line"> --max-validators 10 \</span><br><span class="line"> --withdrawal-fee-denominator 1000 \</span><br><span class="line"> --withdrawal-fee-numerator 1 \</span><br><span class="line"> --deposit-fee-numerator 3 \</span><br><span class="line"> --deposit-fee-denominator 1000 \</span><br><span class="line"> --referral-fee 0</span><br><span class="line">Creating reserve stake 88pq61ETqVXC5E9uaN3tXS2NWFAs7ba2BZuh2spHUMn2</span><br><span class="line">Creating mint GeJY4EHmAyEzPx4GGMZ9wMeFuguDKW6WdLf41fHsRWck</span><br><span class="line">Creating associated token account 4Df2W4DYcHEdz6h4tWTtopDgryoeezPHooocSTx3o26T to receive stake pool tokens of mint GeJY4EHmAyEzPx4GGMZ9wMeFuguDKW6WdLf41fHsRWck, owned by DJEniGyLz8DQCXQUshro9TwqGUWGgQ1PpYgMC9dCoNM9</span><br><span class="line">Creating pool fee collection account 4Df2W4DYcHEdz6h4tWTtopDgryoeezPHooocSTx3o26T</span><br><span class="line">Setting up required accounts for stake pool: reserve stake 88pq61ETqVXC5E9uaN3tXS2NWFAs7ba2BZuh2spHUMn2 and mint GeJY4EHmAyEzPx4GGMZ9wMeFuguDKW6WdLf41fHsRWck</span><br><span class="line">Signature: 3P7Pc5rKTwTWPZnCsqbnSJ4C38UzjcJ985awn4Br33M2kP9MdUCgEhrHJjHvbFxAHMTm4HKnpPKdTXRimcpkgb72</span><br><span class="line">Creating stake pool 3tMgCvn77uZf66XT3vEGzDYXasu9V9SUUtEtpqLvgFKH with validator list 5bqbCjCqdiCgu1Jxed3DKGMgySqdcahbe1aW9QWNuo4h</span><br><span class="line">RPC response error -32002: Transaction simulation failed: Attempt to load a program that does not exist;</span><br></pre></td></tr></table></figure>
<h3 id="已解决(1)"><a href="#已解决(1)" class="headerlink" title="已解决(1)"></a>已解决(1)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Creating stake pool F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i</span><br></pre></td></tr></table></figure>
<p>可以看到设计的哪些账户</p>
<figure class="highlight plaintext"><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">spl-stake-pool set-manager [flass] [options] <></span><br><span class="line"></span><br><span class="line">spl-stake-pool set-fee [flass] [options] <></span><br><span class="line"></span><br><span class="line">spl-stake-pool set-stake [flass] [options] <></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p><img src="E:/hexo/blog/source/imgs/2024126-social%E8%B4%A8%E6%8A%BC/image-20250102134246063.png" alt="image-20250102134246063"></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool -h</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">添加validator</span><br><span class="line">solana validators -u localhost</span><br><span class="line">spl-stake-pool add-validator <your_stake_pool_address> <vote_account_address></span><br><span class="line"></span><br><span class="line">spl-stake-pool list -v <your_stake_pool_address></span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">spl-stake-pool deposit-sol F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i 1.002282880</span><br><span class="line"></span><br><span class="line">spl-stake-pool deposit-sol F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i 1.1</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool add-validator F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i 36HHDkHQQKd9SbJCEfKrntMe69rAhdxV8Hm26r4TwxGU</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spl-stake-pool list -v F8tSahYWyTzk5Mp7yerthEkjoPwfvMQg7uBVfUV9hH4i </span><br></pre></td></tr></table></figure>
<h1 id="问题:"><a href="#问题:" class="headerlink" title="问题:"></a>问题:</h1><h2 id="交易一直不完成"><a href="#交易一直不完成" class="headerlink" title="交易一直不完成"></a>交易一直不完成</h2><p> ⠤ [0/1] Finalizing transaction 3DV4XGaWPQA5Bj2KtoLF28ivwchkD3i4Z8xk5yxYArdRdja7WWXkfTn7MhHjN6LGFEZsAy7KJRk7Kpd4to4dgyE2</p>
<figure class="highlight plaintext"><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">我所需要做的就是通过运行以下命令重新启动本地验证器</span><br><span class="line"></span><br><span class="line">solana-test-validator -r</span><br></pre></td></tr></table></figure>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2024/12/06/2024126-social%E8%B4%A8%E6%8A%BC/" data-id="cm5r2i69900014su7cn543ilc" data-title="solana质押" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SOLANA%E9%A1%B9%E7%9B%AE%E5%85%A5%E9%97%A82-anchor/" rel="tag">SOLANA项目入门2---anchor</a></li></ul>
</footer>
</div>
</article>
<article id="post-2024125-账户的概念和用法" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2024/12/05/2024125-%E8%B4%A6%E6%88%B7%E7%9A%84%E6%A6%82%E5%BF%B5%E5%92%8C%E7%94%A8%E6%B3%95/" class="article-date">
<time class="dt-published" datetime="2024-12-04T17:50:35.000Z" itemprop="datePublished">2024-12-05</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/12/05/2024125-%E8%B4%A6%E6%88%B7%E7%9A%84%E6%A6%82%E5%BF%B5%E5%92%8C%E7%94%A8%E6%B3%95/">账户的概念和用法</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="账户的概念和用法"><a href="#账户的概念和用法" class="headerlink" title="账户的概念和用法"></a>账户的概念和用法</h1><p>合约框架:anchor</p>
<h3 id="创建anchor项目"><a href="#创建anchor项目" class="headerlink" title="创建anchor项目"></a>创建anchor项目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">anchor init <new-workspace-name> </span><br></pre></td></tr></table></figure>
<ol>
<li><p>app:默认为空,用来放前端代码</p>
</li>
<li><p>programs:合约代码。默认会有一个项目同名文件夹,里面有一个lib.rs文件</p>
</li>
<li><p>tests:测试目录。默认包含一个当前项目名的测试</p>
</li>
<li><p>migrations:合约的部署,迁移脚本</p>
</li>
<li><p><code>Anchor.toml</code>:项目的配置文件</p>
<p>本地的合约地址([<code>programs.localnet]</code>)</p>
<p>合约仓库([registry])</p>
<p>solana网络([provider])</p>
<p>脚本([script])。脚本可以使用<code>anchor run <script_name></code>运行,默认是<code>test</code>脚本</p>
</li>
</ol>
<h2 id="实际运行"><a href="#实际运行" class="headerlink" title="实际运行"></a>实际运行</h2><figure class="highlight plaintext"><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">//创建项目</span><br><span class="line">anchor init counter</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">rm </span><br><span class="line">删除文件夹及其内容</span><br><span class="line">rm -r</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">mocha > glob@7.2.0: Glob versions prior to v9 are no longer supported</span><br><span class="line"></span><br><span class="line">LAPTOP-6M4RE4LA# npm show mocha version</span><br><span class="line">11.0.1</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="anchor文件内介绍"><a href="#anchor文件内介绍" class="headerlink" title="anchor文件内介绍"></a>anchor文件内介绍</h3><p>app:存放前端代码</p>
<p>migrations:合约部署和迁移</p>
<p>node_modules:前端使用的和一些脚手架使用的第三方的包</p>
<p>programs:(可存放多个项目)</p>
<p> 项目名:合约存放地</p>
<p>target:编译和debug的目标文件,idl文件</p>
<p>test:测试脚本</p>
<p>anchor.toml:</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">//合约的本地地址</span><br><span class="line">[programs.localnet]</span><br><span class="line">counter = "1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4"</span><br><span class="line"></span><br><span class="line">//合约仓库</span><br><span class="line">[registry]</span><br><span class="line">url = "https://api.apr.dev"</span><br><span class="line">//当前部署的合约网络是本地的网络</span><br><span class="line">[provider]</span><br><span class="line">cluster = "Localnet"</span><br><span class="line">wallet = "~/.config/solana/id.json"</span><br><span class="line"></span><br><span class="line">//脚本</span><br><span class="line">[scripts]</span><br><span class="line">test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"</span><br></pre></td></tr></table></figure>
<p>其他的就是rust中的包管理,使用了workspace的方式</p>
<p>再写一遍加固记忆</p>
<h4 id="programs内项目介绍"><a href="#programs内项目介绍" class="headerlink" title="programs内项目介绍"></a>programs内项目介绍</h4><figure class="highlight plaintext"><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">solana config get</span><br><span class="line">solana config set --url localhost</span><br><span class="line">solana-keygen new</span><br><span class="line">//设置为本地钱包</span><br><span class="line">solana config set -k ~/.config/solana/id.json</span><br><span class="line">cat /root/.config/solana/id.json</span><br><span class="line"></span><br><span class="line">solana balance</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">//声明了合约地址</span><br><span class="line">declare_id!("1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4");</span><br><span class="line"></span><br><span class="line">[programs.localnet]</span><br><span class="line">counter = "1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4"</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">//programs/counter/src</span><br><span class="line">第一步声明了合约的地址</span><br><span class="line">第二部分就是合约的逻辑,用program宏声明的部分</span><br><span class="line">这个宏下面声明的每个public都是一个合约的指令</span><br><span class="line">#[program]</span><br><span class="line">pub mod counter {</span><br><span class="line"> use super::*;</span><br><span class="line"></span><br><span class="line"> pub fn initialize(ctx: Context<Initialize>) -> Result<()> {</span><br><span class="line"> msg!("Greetings from: {:?}", ctx.program_id);</span><br><span class="line"> Ok(())</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//账户的定义,使用派生的方式把结构体实现成一个solana要求的账户的结构</span><br><span class="line">#[derive(Accounts)]</span><br><span class="line">pub struct Initialize {}</span><br></pre></td></tr></table></figure>
<h4 id="账户的概念"><a href="#账户的概念" class="headerlink" title="账户的概念"></a>账户的概念</h4><p>在solana网络中,一切的数据都可以被称为账户</p>
<p><img src="C:/Users/xiang/AppData/Roaming/Typora/typora-user-images/image-20241205111840739.png" alt="image-20241205111840739"></p>
<h4 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">anchor build</span><br></pre></td></tr></table></figure>
<p>target/idl:描述了合约的指令,可以利用idl来进行app端的编写</p>
<figure class="highlight plaintext"><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">anchor deploy</span><br><span class="line">anchor run test</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">LAPTOP-6M4RE4LA# anchor deploy</span><br><span class="line">Deploying cluster: http://127.0.0.1:8899</span><br><span class="line">Upgrade authority: /root/.config/solana/id.json</span><br><span class="line">Deploying program "counter"...</span><br><span class="line">Program path: /root/class/counter/target/deploy/counter.so...</span><br><span class="line">//在anchor.toml地址一样</span><br><span class="line">Program Id: 1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4</span><br><span class="line"></span><br><span class="line">Signature: 2buCQ31i8A1nnx9mVxGJGWHdQeTwtPKwv65nHrMSPZin4EzsE8DvcQUcCQsMR7bTpTYd9Uobs7zDLREXzAadwLrj</span><br></pre></td></tr></table></figure>
<h4 id="关于出现account-data-too-small"><a href="#关于出现account-data-too-small" class="headerlink" title="关于出现account data too small"></a>关于出现account data too small</h4><p>自定义合约数据太小,塞不下</p>
<p>solana每次部署会按照2倍的容量预留,程序扩大所以空间不够了</p>
<p>可以使用</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">solana program extend 1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4 1000</span><br></pre></td></tr></table></figure>
<figure class="highlight plaintext"><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">anchor.toml</span><br><span class="line">//programid</span><br><span class="line">[programs.localnet]</span><br><span class="line">counter = "1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4"</span><br><span class="line"></span><br><span class="line">1000是扩容的字节数</span><br></pre></td></tr></table></figure>
<p>可以看到idl多了increment的指令</p>
<figure class="highlight plaintext"><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">ctx.accounts.counter.count = ctx.accounts.counter.count.checked_add(1).unwrap();</span><br><span class="line"></span><br><span class="line">check_add不是在原有的基础上加一,而是产生一个返回值</span><br></pre></td></tr></table></figure>
<h4 id="编译并部署"><a href="#编译并部署" class="headerlink" title="编译并部署"></a>编译并部署</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">anchor build && anchor deploy</span><br></pre></td></tr></table></figure>
<p>可以看到</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ count: <BN: 1> }而不是之前的{ count: <BN: 0> }</span><br></pre></td></tr></table></figure>
<p>其部署代码为</p>
<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">it("Reader counter",async() => {</span><br><span class="line"> const counterKeypair = new anchor.web3.PublicKey("9rNwH3menMJp3wHsXpJYPHvRiq6z3amzz2TVDPh9ipy8")</span><br><span class="line"> const currentCount = await program.account.counter.fetch(counterKeypair);</span><br><span class="line"> console.log(currentCount)</span><br><span class="line">})</span><br></pre></td></tr></table></figure>
<p>再运行可以看到,不断的加1</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ count: <BN: 2> }</span><br></pre></td></tr></table></figure>
<h4 id="回顾"><a href="#回顾" class="headerlink" title="回顾"></a>回顾</h4><p>需要地址</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">declare_id!("1BFbuvVvb4kPkNHpeo1f1eS2gTfQsiJaiiDyfYZGqR4");</span><br></pre></td></tr></table></figure>
<p>在#[program]每个pub fn都是一个指令,但是每个指令的第一个参数都是我们需要的账户的集合,在struct写需要哪些账户,指定counter账户里的数据格式,像这样</p>
<figure class="highlight plaintext"><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">#[account]</span><br><span class="line">pub struct Counter{</span><br><span class="line"> count:u64,</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>利用anchor提供的一些属性宏,就不用在app侧进行初始化,anchor框架可以初始化。至少这三个搭配在一起,anchor会帮助初始化</p>
<figure class="highlight plaintext"><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">#[account(</span><br><span class="line"> init,</span><br><span class="line"> payer = payer,</span><br><span class="line"> space = 8 + 8,</span><br><span class="line">)]</span><br></pre></td></tr></table></figure>
<p>想要赋值时就和正常代码的赋值一样,把正常的值进行修改就可以</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ctx.accounts.counter.count = ctx.accounts.counter.count.checked_add(1).unwrap();</span><br></pre></td></tr></table></figure>
<h1 id="pda的概念和用法"><a href="#pda的概念和用法" class="headerlink" title="pda的概念和用法"></a>pda的概念和用法</h1><p>pda:派生账户</p>
<p>pda的使用场景</p>
<p>方法1:hashmap</p>
<p>问题在于,当用户比较多时,账户有10M大小的限制,和web2不一样的是app是可以直接读账户,而不需要通过合约。而当app拉取account,Dapp当查询某一个人的计时器需要拉取全部数据</p>
<p>方法2:独立账户</p>
<p>给不同的wallet生成不同的counter账户</p>
<p>对于a和b比较麻烦,因为需要记住各自的地址。像网站的密码和用户名</p>
<p>方法3:PDA</p>
<p>优点:</p>
<ul>
<li>不需要记住钱包和账户的映射关系</li>
<li>每个账户独立且不会冲突</li>
</ul>
<p>还是不同的wallet生成不同的counter账户,但地址可能就是</p>
<p>wallet A pubkeys + program pubkey</p>
<p>wallet B pubkeys + program pubkey</p>
<p>账户的地址也必须是合法的32位的</p>
<figure class="highlight plaintext"><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">findProgramAddressSync函数去生成[PDA,bump]</span><br><span class="line">两个部分seed[Buffer.from(string)]</span><br><span class="line">programid</span><br></pre></td></tr></table></figure>
<p>在lib里加seed和bump指定账户为PDA账户</p>
<figure class="highlight plaintext"><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">#[account(</span><br><span class="line"> init,</span><br><span class="line"> payer = payer,</span><br><span class="line"> space = 8 + 8,</span><br><span class="line"> seeds = [payer.key().as_ref()],</span><br><span class="line"> bump </span><br><span class="line">)]</span><br></pre></td></tr></table></figure>
<p>bump可以指定,但是不指定使用的就是匹配上的第一个</p>
<p>第一次运行pda,</p>
<p>第一次运行成功,第二次报错。</p>
<p>因为PDA派生的规则没有变,所以counterkeypair一直是一个地址。所以不能重复地初始化了</p>
<figure class="highlight plaintext"><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">const [counterKeypair,bump] = anchor.web3.PublicKey.findProgramAddressSync(</span><br><span class="line"> [wallet.publicKey.toBytes()],</span><br><span class="line"> program.programId,</span><br><span class="line">);</span><br></pre></td></tr></table></figure>
<h4 id="CPI"><a href="#CPI" class="headerlink" title="CPI"></a>CPI</h4>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2024/12/05/2024125-%E8%B4%A6%E6%88%B7%E7%9A%84%E6%A6%82%E5%BF%B5%E5%92%8C%E7%94%A8%E6%B3%95/" data-id="cm5r2i69500004su70msoarbb" data-title="账户的概念和用法" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SOLANA%E9%A1%B9%E7%9B%AE%E5%85%A5%E9%97%A82-anchor/" rel="tag">SOLANA项目入门2---anchor</a></li></ul>
</footer>
</div>
</article>
<article id="post-2024121-SOLANA社交项目实践1" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2024/12/02/2024121-SOLANA%E7%A4%BE%E4%BA%A4%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B51/" class="article-date">
<time class="dt-published" datetime="2024-12-01T16:29:35.000Z" itemprop="datePublished">2024-12-02</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/12/02/2024121-SOLANA%E7%A4%BE%E4%BA%A4%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B51/">SOLANA社交项目实践1</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="社交项目"><a href="#社交项目" class="headerlink" title="社交项目"></a>社交项目</h1><p>功能实现:关注、取消关注、查询关注列表、发帖、查询发帖</p>
<p>创建项目</p>
<figure class="highlight plaintext"><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">cargo new friend --lib</span><br><span class="line">cargo new friend-cli</span><br><span class="line">//服务端,写智能合约</span><br><span class="line">code ./friend</span><br><span class="line">//客户端具体方案合约</span><br><span class="line">code ./friend-cli</span><br></pre></td></tr></table></figure>
<h2 id="friend"><a href="#friend" class="headerlink" title="friend"></a>friend</h2><p>创建好文件目录结构,5个</p>
<p>引入toml</p>
<p>处理的时候写在processor里</p>
<h5 id="Pubkey-find-program-address"><a href="#Pubkey-find-program-address" class="headerlink" title="Pubkey::find_program_address"></a>Pubkey::find_program_address</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let (pda,bump_seed) = Pubkey::find_program_address(&[user_account.key.as_ref(),seed.as_bytes()], program_id);</span><br></pre></td></tr></table></figure>
<p>pda:Pubkey,生成的程序派生地址</p>
<p><strong>PDA 地址</strong> 是由程序(智能合约)通过给定的种子(<code>seed</code>)和程序公钥(<code>program_id</code>)派生出来的地址。该地址没有私钥,通常用于存储与程序逻辑相关的数据。</p>
<p>bump_seed:u8,它是用来“调整” PDA 地址的值,防止地址冲突。</p>
<p>使用一个“bump”值进行调整种子,以确保每次计算的地址是唯一的。</p>
<p>Pubkey::find_program_address:计算程序派生地址(PDA)。由给定程序和种子唯一生成的。</p>
<p><strong><code>seed</code></strong>: 这是一个字节数组切片,通常是用来唯一标识与程序相关联的某个数据。</p>
<p><strong><code>program_id</code></strong>: 这是调用此方法的 Solana 程序的公钥,表示计算出的地址与哪个程序相关联。</p>
<h5 id="账户大小"><a href="#账户大小" class="headerlink" title="账户大小"></a>账户大小</h5><p>每个账户存储的量是有大小,存储上限:定义MAX_FOLLOWER_COUNT</p>
<h2 id="friend-cli"><a href="#friend-cli" class="headerlink" title="friend-cli"></a>friend-cli</h2>
</div>
<footer class="article-footer">
<a data-url="https://auo578.github.io/2024/12/02/2024121-SOLANA%E7%A4%BE%E4%BA%A4%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B51/" data-id="cm477y2l80001c4u70vq4g77t" data-title="SOLANA社交项目实践1" class="article-share-link">分享</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SOLANA%E9%A1%B9%E7%9B%AE%E5%85%A5%E9%97%A81/" rel="tag">SOLANA项目入门1</a></li></ul>
</footer>
</div>
</article>
<article id="post-SPLtoken合约创建" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2024/12/01/SPLtoken%E5%90%88%E7%BA%A6%E5%88%9B%E5%BB%BA/" class="article-date">
<time class="dt-published" datetime="2024-11-30T16:31:30.000Z" itemprop="datePublished">2024-12-01</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/12/01/SPLtoken%E5%90%88%E7%BA%A6%E5%88%9B%E5%BB%BA/">SPLtoken合约创建</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h2 id="SPLtoken合约创建"><a href="#SPLtoken合约创建" class="headerlink" title="SPLtoken合约创建"></a>SPLtoken合约创建</h2><p>1.创建mint账号(指令)</p>
<p>2.创建ATA后mint代币</p>
<h5 id="solana项目结构核心文件:"><a href="#solana项目结构核心文件:" class="headerlink" title="solana项目结构核心文件:"></a>solana项目结构核心文件:</h5><p>processor.rs:核心业务逻辑,处理指令</p>
<p>state.rs:定义账户的状态和扩展字段,包括像一些数据存储的数据结构(可以理解为mod)</p>
<p>instruction.rs:定义各种代币操作的指令</p>
<p>error.rs:定义了程序可能抛出的错误</p>
<p>lib.rs:程序入口点,汇总各个模块</p>