Skip to content

Commit 6cf1e4a

Browse files
authored
Update Elemen.md
9.07
1 parent 152c20f commit 6cf1e4a

File tree

1 file changed

+282
-2
lines changed

1 file changed

+282
-2
lines changed

Elemen.md

+282-2
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,289 @@ timezone: Pacific/Auckland # 新西兰标准时间 (UTC+12)
6060

6161
<!-- Content_START -->
6262

63-
### 2024.07.11
63+
### 2024.09.07
6464

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`,与将资源添加到帐户的功能相同
66346

67347
### 2024.07.12
68348

0 commit comments

Comments
 (0)