@@ -60,9 +60,289 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12)
60
60
61
61
<!-- Content_START -->
62
62
63
- ### 2024.07.11
63
+ ### 2024.09.07
64
64
65
- 笔记内容
65
+ > https://github.com/aptos-labs/aptos-core/
66
+
67
+ > github代码参考:https://github.com/aptos-labs/aptos-core/
68
+
69
+ #### 模块交互与发布
70
+
71
+ ##### 发布
72
+
73
+ 生成账户地址:aptos init
74
+
75
+ 领水:aptos account fund-with-faucet --account de fault
76
+
77
+ 编译:aptos move compile
78
+
79
+ 测试: aptos move test
80
+
81
+ 发布:aptos move publish
82
+
83
+ ##### 交互
84
+
85
+ Aptos 区块链浏览器:https://explorer.aptoslabs.com/
86
+
87
+ 生成的` sender ` 来搜索(记得切换对应网络)
88
+
89
+ 点击 Modules-run 实施交互,进行基本调试
90
+
91
+ #### Vector 向量解析
92
+
93
+ 特性:vector 可以理解为其他语言的数组
94
+
95
+ ##### 查询功能
96
+
97
+ | 语法 | 描述 |
98
+ | -------------------------------------------------------- | --------------------------------------- |
99
+ | vector::is_empty<T >(): bool | 查询是否是空数组 |
100
+ | vector::length<T >(v: &vector<T >): u64 | 查询数组长度 |
101
+ | vector::borrow<T >(v: &vector<T >, i: u64): &T | 返回数组第n项的数据 |
102
+ | vector::borrow_mut<T >(v: &mut vector<T >, i: u64): &mut T | 返回数组第n项的可变引用 |
103
+ | vector::contains<T >(v: &vector<T >, e: &T): bool | 如果元素e在数组中,则返回true |
104
+ | vector::index_of<T >(v: &vector<T >, e: &T): (bool, u64) | 如果元素e在数组中,则返回true和索引位置 |
105
+
106
+ ##### 增删改
107
+
108
+ | ** 语法** | ** 描述** |
109
+ | ------------------------------------------------------------ | --------------------------- |
110
+ | vector::push_back<T >(v: &mut vector<T >, t: T) | 添加尾部1个元素 |
111
+ | vector::append<T >(v1: &mut vector<T >, v2: vector<T >) | 添加尾部1个数组 |
112
+ | vector::reverse_append<T >(lhs: &mut vector<T >, other: vector<T >) | 添加尾部1个数组,并进行排序 |
113
+ | vector::pop_back<T >(v: &mut vector<T >): T | 删掉尾部1个元素 |
114
+ | vector::destroy_empty<T >(v: vector<T >) | 删除数组 |
115
+ | vector::swap<T >(v: &mut vector<T >, i: u64, j: u64) | 交换数组中两个元素的位置 |
116
+ | vector::reverse<T >(v: &mut vector<T >) | 反转数组中元素的顺序 |
117
+ | vector::insert<T >(v: &mut vector<T >, i: u64, e: T) | 在长度为i-1处插入一个元素 |
118
+ | vector::remove<T >(v: &mut vector<T >, i: u64): T | 删除索引为i处的元素 |
119
+
120
+ #### 函数修饰符
121
+
122
+ ##### 核心概念
123
+
124
+ 函数修饰符是用来赋予函数特殊能力的一组关键字。
125
+
126
+ ** 主要有以下几类**
127
+
128
+ 可见性
129
+
130
+ - 无public,私有函数,仅限module内部调用
131
+
132
+ - friend (public),模块内部函数,同包模块之间可以调用
133
+
134
+ - public,模块公开函数,所有模块都可以调用
135
+
136
+ 全局存储引用
137
+
138
+ - acquires,当需要使用` move_from ` 、` borrow_global ` 、` borrow_global_mut ` 访问地址下的资源的时候,需要用其修饰
139
+
140
+ 链下
141
+
142
+ - entry,修饰后,该方法可由链下脚本调用
143
+
144
+ ##### 代码示例1
145
+
146
+ ``` move
147
+ address 0x42{
148
+ module m{
149
+ friend 0x42::m3;
150
+
151
+ fun f1() : u64{
152
+ 1
153
+ }
154
+ //public 可以被外部访问
155
+ public fun f2() : u64{
156
+ 2
157
+ }
158
+ //外部模块无法直接调用,需要声明friend
159
+ public(friend) fun f3() : u64{
160
+ 3
161
+ }
162
+ }
163
+ module m2{
164
+ fun f1() : u64{
165
+ 0x42::m::f2()
166
+ }
167
+ }
168
+ //view f2 f3
169
+ module m3{
170
+ fun f1() : u64{
171
+ 0x42::m::f3()
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ ##### 代码示例2
178
+
179
+ ``` move
180
+ module 0x42::Demo{
181
+ use std::debug;
182
+ // 每个账户在 move 中都有一个唯一的 Signer,它通常是账户的创建者或者拥有者。
183
+ use std::signer;
184
+
185
+ struct Coin has key{
186
+ value:u64
187
+ }
188
+
189
+ //可以被链下调用
190
+ public entry fun mint(account: &signer, value: u64){
191
+ //将Coin移动到用户的地址中去
192
+ move_to(account, Coin{value});
193
+ }
194
+
195
+ #[test(account = @0x42)]
196
+ //acquires
197
+ public fun test_mint(account: &signer)acquires Coin{
198
+
199
+ //获取account的地址
200
+ let addr = signer::address_of(account);
201
+ mint(account, 10);
202
+
203
+ //从全局资源中借用指定地址addr处的Coin类型资源,并获取其value
204
+ let coin = borrow_global<Coin>(addr).value;
205
+ debug::print(&coin)
206
+ }
207
+
208
+ }
209
+ ```
210
+
211
+ #### struct 结构体
212
+
213
+ ##### 核心概念
214
+
215
+ Struct 结构体,用来存储具有结构化的数据,sturct可以相互嵌套(不能递归)可存储地址下作为资源,默认情况下,结构声明是线性且短暂的(也就是没办法引用)
216
+
217
+ 1. 命名必须以大写字母开头
218
+ 2. 可以通过has 关键词赋与能力
219
+
220
+ ##### 修饰符
221
+
222
+ -Copy 值能够被复制
223
+ -Drop 值可以在作用域结束时删除
224
+ -Key 值可以用作全局存储操作的key,可以索引到相关结构体
225
+ -Store 值可以被全局存储,结合key使用,实现嵌套
226
+
227
+ 除struct类型外,其他的类型默认具备 store,drop,copy 的能力,sturct 最终是存储在用户的地址上(或者被销毁),不存在aptos合约里,aptos合约是一个全纯的函数(相较于Solidity)
228
+
229
+ ##### Object 对象
230
+
231
+ 1 . 对象是单个地址的资源容器,用于储存资源;
232
+ 2 . 对象提供了一种集中式资源控制与所有权管理的方法;
233
+
234
+ ##### 创建并转移对象案例
235
+
236
+ ``` move
237
+ module my_addr::object_playgoud{
238
+ use std::signer;
239
+ use aptos_framework::object::{self,ObjectCore};
240
+
241
+ entry fun create_and_transfer(caller:&signer,destination:address){
242
+ //接受拥有者地址
243
+ let caller_adsress = signer::address_of(caller);
244
+ //绑定地址和对象
245
+ let constructor_ref = object::create_object(caller_address);
246
+
247
+ //Set up the object
248
+
249
+ //transfer to destination
250
+ //转移所有权
251
+ let object = object::object_from_constructor_ref<ObjectCore>(
252
+ &constructor_ref
253
+ );
254
+ object::transfer(caller,object,destination);
255
+ }
256
+
257
+ ```
258
+
259
+
260
+
261
+ ##### 三种对象类型
262
+
263
+ - 普通对象** 。** 可删除,且具有随机地址` object::create_object(owner_address: address) `
264
+ - 命名对象。不可删除,通过固定的signer和特定的seed生成唯一地址的对象,1个地址只能生成1个,具有确定性地址` object::create_named_object(creator: &signer, seed: vector<u8>) `
265
+ - 粘性对象。不可删除,通过signer生成的对象,1个地址可以生成多个,具有随机地址` object::create_sticky_object(owner_address: address) `
266
+
267
+ 示例代码:
268
+
269
+ ``` move
270
+ module 0x42::demo{
271
+ use std::debug::print;
272
+ use aptos_framework::object;
273
+ use aptos_framework::object::{Object, ConstructorRef, ObjectCore};
274
+
275
+ use std::signer;
276
+
277
+ const NAME:vector<u8> = b"myObject";
278
+ //can_delet
279
+ public fun createDeleteableObject(caller: &signer):ConstructorRef{
280
+ let caller_addr = signer::address_of(caller);
281
+ let obj = object::create_object(caller_addr);
282
+ obj
283
+ }
284
+
285
+
286
+
287
+ //aptos-labs/examples
288
+
289
+ //cannt
290
+ public fun createNamedObject(caller: &signer):ConstructorRef{
291
+ let obj = object::create_named_object(caller, NAME);
292
+ obj
293
+ }
294
+ public fun createStickyObject(caller: &signer):ConstructorRef{
295
+ let caller_addr = signer::address_of(caller);
296
+ let obj = object::create_sticky_object(caller_addr);
297
+ obj
298
+ }
299
+ #[test(caller = @0x88)]
300
+ fun test2(caller: &signer){
301
+ let obj = createNamedObject(caller);
302
+ print(&obj);
303
+ }
304
+
305
+
306
+ #[test(caller = @0x88)]
307
+ fun test(caller: &signer){
308
+ let obj = createDeleteableObject(caller);
309
+ print(&obj);
310
+ }
311
+
312
+ #[test(caller = @0x88)]
313
+ fun test3(caller: &signer){
314
+ let obj = createStickyObject(caller);
315
+ print(&obj);
316
+ }
317
+
318
+ }
319
+ ```
320
+
321
+
322
+
323
+ ##### Object 配置
324
+
325
+ 一旦您创建了对象,您将收到一个` ConstructorRef ` 可用于生成其他` Ref ` s 。` Refs ` 可在将来用于启用/禁用/执行某些对象功能,例如传输资源、传输对象本身或删除对象。
326
+
327
+ 1 . 允许删除对象 ( ` DeleteRef ` )
328
+
329
+ 对于使用默认方法(允许删除)创建的对象,您可以生成一个` DeleteRef ` 稍后可以使用的对象。这可以帮助消除混乱并获得存储退款。` DeleteRef ` 您不能为不可删除的对象创建。
330
+
331
+ 2 . 一次性转账 ( ` LinearTransferRef ` )
332
+
333
+ 此外,如果创建者想要控制所有传输,以提供一次性使用的传输功能。这可用于通过从对象创建者到接收者的一次性传输来创建“灵魂绑定”对象。必须` LinearTransferRef ` 由对象的所有者使用。
334
+
335
+ 3 . 禁用/切换传输 ( ` TransferRef ` )
336
+
337
+ 默认情况下,所有对象都是可转让的。这可以通过 来更改,` TransferRef ` 来生成` object::generate_transfer_ref ` 。
338
+
339
+ 4 . 添加可扩展性(` ExtendRef ` )
340
+
341
+ 将对象变成可动态配置的,可以往里面添置新的 struct 资源。生成一个` ExtendRef ` 和` object::generate_extend_ref ` 。此引用可用于为该对象生成签名者。
342
+
343
+ 5 . 添加资源
344
+
345
+ 使用` ConstructorRef ` 和` object::generate_signer ` 创建一个签名者,允许您将资源转移到对象上。这使用` move_to ` ,与将资源添加到帐户的功能相同
66
346
67
347
### 2024.07.12
68
348
0 commit comments