Dfinity参考命令及规范
DFX命令
DFINITY 命令行执行环境 ( dfx
) 是用于创建、部署和管理您为 Internet Computer 区块链开发的应用程序的主要工具。
您可以使用dfx
带有不同标志和子命令的父命令来执行不同类型的操作。
运行dfx
命令的基本语法是:
dfx [option] [subcommand] [flag]
根据子命令,您指定的选项和标志可能适用于父命令或特定子命令。例如,用于启用或禁止详细日志记录的标志是dfx
为父命令指定的,然后应用于任何子命令。
安装 DFINITY Canister SDK 后,您可以使用以下命令指定要执行的操作。有关说明如何使用这些命令的参考信息和示例,请选择适当的命令。
- dfx
- dfx bootstrap
- dfx build
- dfx cache
- dfx canister
- dfx config
- dfx deploy
- dfx help
- dfx identity
- dfx ledger
- dfx new
- dfx ping
- dfx replica
- dfx start
- dfx stop
- dfx upgrade
- dfx wallet
DFX环境变量
您可以使用环境变量为 DFINITY Canister SDK 执行环境配置某些属性。
本节列出了当前支持的环境变量以及如何使用它们的示例。在大多数情况下,您可以通过在终端中执行命令或在文件中添加类似于以下内容的行来为会话设置环境变量.profile
:
export DFX_TELEMETRY_DISABLED=1
CANISTER_CANDID_PATH_{canister.name}
使用带有CANISTER_CANDID_PATH
前缀的环境变量来引用在dfx.json
项目文件中作为依赖项列出的容器的 Candid 描述文件的路径。
例如,如果您有一个在键下列出的whoami_assets
容器,您可以使用环境变量来引用文件的位置,对于本地开发,它可能是:whoami``dependencies``CANISTER_CANDID_PATH_whoami_assets``whoami.did
$PROJECT_ROOT/.dfx/local/canisters/whoami/whoami.did
CANISTER_ID_{canister.name}
使用带有CANISTER_ID
前缀的环境变量来引用dfx.json
项目文件中每个容器的容器标识符。
例如,如果您有一个linkedup
由linkedup
和connectd
容器组成的项目,您可以使用CANISTER_ID_linkedup
和CANISTER_ID_connectd
环境变量来引用容器标识符——例如ryjl3-tyaaa-aaaaa-aaaba-cai
和rrkah-fqaaa-aaaaa-aaaaq-cai
——为您的项目创建。
DFX_CONFIG_ROOT
使用DFX_CONFIG_ROOT
环境变量指定不同的位置来存储.cache
和 的.config
子目录dfx
。
默认情况下,.cache
和.config
目录位于开发环境的主目录中。例如,在 macOS 上,默认位置在/Users/<YOUR-USER-NAME>
目录中。使用DFX_CONFIG_ROOT
环境变量为这些目录指定不同的位置。
DFX_CONFIG_ROOT=~/ic-root
DFX_INSTALLATION_ROOT
如果您不使用操作系统的默认位置,请使用DFX_INSTALLATION_ROOT
环境变量为dfx
二进制文件指定不同的位置。
该.cache/dfinity/uninstall.sh
脚本使用此环境变量来标识 DFINITY Canister SDK 安装的根目录。
DFX_TELEMETRY_DISABLED
使用DFX_TELEMETRY_DISABLED
环境变量选择不收集有关dfx
使用情况的数据。
默认情况下,dfx
配置为收集匿名信息——即没有 IP 地址或用户信息等识别信息——有关dfx
命令活动和错误的数据。默认情况下会启用收集匿名数据,以根据使用模式和行为改善开发人员体验。
但是,如果您想阻止收集有关dfx
使用情况的数据,您可以通过将DFX_TELEMETRY_DISABLED
环境变量设置为 1来明确选择退出。
DFX_TELEMETRY_DISABLED=1
DFX_VERSION
使用DFX_VERSION
环境变量来标识要安装的 DFINITY Canister SDK 的特定版本。
DFX_VERSION=0.7.2 sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"
支持的类型
本节列出了 Candid 支持的所有类型。对于每种类型,参考包括以下信息:
- 类型语法和类型的文本表示的语法。
- 每种类型的升级规则是根据类型的可能子类型和超类型给出的。
- Rust、Motoko 和 Javascript 中的对应类型。
子类型是您可以将方法结果更改为的类型。超类型是您可以将方法参数更改为的类型。
您应该注意,此参考仅列出了与每种类型相关的特定子类型和超类型。它不会重复有关可应用于任何类型的子类型和超类型的公共信息。例如,引用不会empty
作为子类型列出,因为它可以是任何其他类型的子类型。同样,类型reserved
和opt t
也没有列为特定类型的超类型,因为它们是任何类型的超类型。有关的子类型规则的详细信息empty
,reserved
以及opt t
类型,请参阅以下部分:
Type text
该text
类型用于人类可读的文本。更准确地说,它的值是 unicode 代码点序列(不包括代理部分)。
-
类型语法
text
-
文本语法
""
"Hello"
"Escaped characters: \n \r \t \\ \" \'"
"Unicode escapes: \u{2603} is ☃ and \u{221E} is ∞"
"Raw bytes (must be utf8): \E2\98\83 is also ☃"
-
对应的元子类型
Text
-
对应的 Rust 类型
String
或者&str
-
对应的 JavaScript 值
"String"
Type blob
该blob
类型可用于二进制数据,即字节序列。使用该blob
类型编写的接口可以与使用vec nat8
.
-
类型语法
blob
-
文本语法
blob <text>
where<text>
代表一个文本文字,所有字符都代表它们的 utf8 编码,以及任意字节序列 ("\CA\FF\FE"
)。 -
亚型
vec nat8
,以及 的所有子类型vec nat8
。 -
超类型
vec nat8
,以及 的所有超类型vec nat8
。 -
对应的元子类型
Blob
-
对应的 Rust 类型
Vec<u8>
或者&[u8]
-
对应的 JavaScript 值
[ 1, 2, 3, 4, ... ]
Type nat
该nat
类型包含所有自然(非负)数。它是无界的,可以表示任意大数。在线编码是 LEB128,因此仍然可以有效地表示小数。
-
类型语法
nat
-
文本语法
1234
1_000_000
0xDEAD_BEEF
-
超类型
int
-
对应的元子类型
Nat
-
对应的 Rust 类型
candid::Nat
或者u128
-
对应的 JavaScript 值
new BigNumber("10000")
来自bignumber.js
npm 包Type int
该
int
类型包含所有整数。它是无界的,可以表示任意的小数或大数。在线编码是 SLEB128,因此仍然可以有效地表示小数。-
类型语法
int
-
文本语法
1234 -1234 +1234 1_000_000 -1_000_000 +1_000_000 0xDEAD_BEEF -0xDEAD_BEEF +0xDEAD_BEEF
-
亚型
nat
-
对应的元子类型
Int
-
对应的 Rust 类型
candid::Int
或者i128
-
对应的 JavaScript 值
new BigNumber("-10000")
来自bignumber.js
npm 包
-
Type natN 和 intN
类型nat8
, nat16
, nat32
, nat64
, int8
, int16
,int32
和int64
表示具有那么多位表示的数字,并且可以在更多“低级”接口中使用。
的范围natN
是{0 … 2^N-1}
,范围intN
是-2^(N-1) … 2^(N-1)-1
。
在线表示正是那么多位长。因此,对于较小的值,nat
比 更节省空间nat64
。
-
类型语法
nat8
,nat16
,nat32
,nat64
,int8
,int16
,int32
或int64
-
文本语法
同
nat
为nat8
,nat16
,nat32
,和nat64
。同int
为int8
,int16
,int32
和int64
。我们可以使用类型注释来区分不同的整数类型。
100 : nat8
-100 : int8
(42 : nat64)
-
对应的元子类型
natN
默认情况下转换为NatN
,但也可以WordN
在需要时对应。intN
翻译成IntN
. -
对应的 Rust 类型
相应大小的有符号和无符号整数。长度签未签名8 位i8u816 位i16u1632 位i32u3264 位i64u64
-
对应的 JavaScript 值
8 位、16 位和 32 位转换为数字类型。
int64
并nat64
转换为 中的BigNumber
对象bignumber.js
。
Type float32 and float64
类型float32
和float64
以单精度(32 位)和双精度(64 位)表示 IEEE 754 浮点数。
-
类型语法
float32
,float64
-
文本语法
与 相同的语法
int
,加上浮点文字如下:
1245.678
+1245.678
-1_000_000.000_001
34e10
34E+10
34e-10
0xDEAD.BEEF
0xDEAD.BEEFP-10
0xDEAD.BEEFp+10
-
对应的元子类型
float64
对应于Float
。float32
并没有目前在元子表示。float32
Motoko 程序不能提供或使用坦率的接口。 -
对应的 Rust 类型
f32
,f64
-
对应的 JavaScript 值
浮点数
Type bool
该bool
类型是一种逻辑数据类型,只能具有值true
或false
。
-
类型语法
bool
-
文本语法
true
,false
-
对应的元子类型
Bool
-
对应的 Rust 类型
bool
-
对应的 JavaScript 值
true
,false
Type vec t(向量)
该vec
类型表示向量(序列、列表、数组)。type 的值vec t
包含零个或多个 type 值的序列t
。
-
类型语法
vec bool
,vec nat8
,vec vec text
, 等等。 -
文本语法
vec {}
vec { "john@doe.com"; "john.doe@example.com" };
-
亚型
每当
t
是 的子类型时t'
,则vec t
是 的子类型vec t'
。blob
是 的子类型vec nat8
。 -
超类型
每当
t
是 的超类型时t'
,则vec t
是 的超类型vec t'
。blob
是 的超类型vec nat8
。 -
对应的元子类型
[T]
,其中 Motoko 类型T
对应于t
。 -
对应的 Rust 类型
Vec<T>
或&[T]
,其中 Rust 类型T
对应于t
。vec t
可以翻译成BTreeSet
或HashSet
。vec record { KeyType; ValueType }
可以翻译成BTreeMap
或HashMap
。 -
对应的 JavaScript 值
Array
,例如[ "text", "text2", … ]
Type opt t
该opt t
类型包含类型的所有值t
,再加上特殊的null
价值。它用于表示某些值是可选的,这意味着数据可能作为某种类型t
的值存在,或者可能作为值不存在null
。
该opt
类型可以嵌套(例如,opt opt text
),和的值null
和opt null
是不同的值。
该opt
类型扮演的偷拍接口的演变至关重要的作用,如后所述具有特殊的子类型规则。
-
类型语法
opt bool
,opt nat8
,opt opt text
, 等等。 -
文本语法
null
opt true
opt 8
opt null
opt opt "test"
-
亚型
子类型化的规范规则
opt
是:每当t
是 的子类型时t'
,则opt t
是 的子类型opt t'
。null
是 的子类型opt t'
。t
是opt t
( 除非t
它本身是null
,opt …
或reserved
)的子类型。此外,由于与升级和高阶服务相关的技术原因,每个类型都是 的子类型opt t
,null
如果类型不匹配,则会产生。但是,建议用户不要直接使用该规则。 -
超类型
每当
t
是 的超类型时t'
,则opt t
是 的超类型opt t'
。 -
对应的元子类型
?T
,其中 Motoko 类型T
对应于t
。 -
对应的 Rust 类型
Option<T>
,其中 Rust 类型T
对应于t
. -
对应的 JavaScript 值
null
翻译成[]
.opt 8
翻译成[8]
.opt opt "test"
翻译成[["test"]]
.
Type record { n : t, … }
甲record
类型是标记的值的集合。例如,下面的代码给出了名字address
到所有具有文本字段的记录类型street
,city
以及country
和数字领域zip_code
。
type address = record {
street : text;
city : text;
zip_code : nat;
country : text;
};
记录类型声明中字段的顺序无关紧要。每个字段可以有不同的类型(与向量不同)。记录字段的标签也可以是 32 位自然数,如下例所示:
type address2 = record {
288167939 : text;
1103114667 : text;
220614283 : nat;
492419670 : text;
};
事实上,文本标签将被视为其领域的散列,并顺便说一句,address
和address2
是对偷拍同一类型。
如果省略标签,Candid 会自动分配按顺序增加的标签。此行为导致以下缩短的语法,通常用于表示对和元组。类型record { text; text; opt bool }
相当于record { 0 : text; 1: text; 2: opt bool }
- 类型语法
record {}
record { first_name : text; second_name : text }
record { "name with spaces" : nat; "unicode, too: ☃" : bool }
record { text; text; opt bool }
- 文本语法
record {}
record { first_name = "John"; second_name = "Doe" }
record { "name with spaces" = 42; "unicode, too: ☃" = true }
record { "a"; "tuple"; null }
-
亚型
记录的子类型是具有附加字段(任何类型)的记录类型,其中某些字段的类型更改为子类型,或者删除了可选字段。但是,删除方法结果中的可选字段是不好的做法。您可以将字段的类型更改为
opt empty
以指示不再使用该字段。例如,如果您有一个函数返回以下类型的记录:
record {
first_name : text; middle_name : opt text; second_name : text; score : int
}
您可以将其演变为返回以下类型记录的函数:
record {
first_name : text; middle_name : opt empty; second_name : text; score : nat; country : text
}
在我们已弃用该middle_name
字段的地方,更改了该字段的类型score
并添加了该country
字段。
-
超类型
记录的超类型是删除了某些字段、某些字段的类型更改为超类型或添加了可选字段的记录类型。后者允许您使用附加字段扩展参数记录。使用旧接口的客户端不会在其记录中包含该字段,该字段将在升级服务中按预期解码为
null
.例如,如果您有一个需要类型记录的函数:
record { first_name : text; second_name : text; score : nat }
您可以将其演变为期望类型记录的函数:
record { first_name : text; score: int; country : opt text }
-
对应的元子类型
如果记录类型看起来像是可以引用元组(即从 0 开始的连续标签),则使用 Motoko 元组类型(例如
(T1, T2, T3)
)。否则,使用 Motoko 记录({ first_name :Text, second_name : Text })
。如果字段名称是 Motoko 中的保留名称,则会附加一个反下划线。所以record { if : bool }
对应于{ if_ : Bool }
。如果(即使如此)字段名称不是有效的 Motoko 标识符,则使用字段哈希代替:record { ☃ : bool }
对应于.{ *11272781* : Boolean }
-
对应的 Rust 类型
struct
用#[derive(CandidType, Deserialize)]
trait定义的用户。您可以使用该#[serde(rename = "DifferentFieldName")]
属性来重命名字段名称。如果记录类型是元组,则可以将其转换为元组类型,例如(T1, T2, T3)
. -
对应的 JavaScript 值
如果记录类型是元组,则将值转换为数组,例如
["Candid", 42]
.否则它会转换为记录对象。例如,{ "first name": "Candid", age: 42 }
。如果字段名称是散列,我们使用_hash_
作为字段名称,例如,{ _1_: 42, "1": "test" }
。
Type variant { n : t, … }
甲variant
类型表示一个值,该值是从给定的情况下,或只有一个标签。所以类型的值:
type shape = variant {
dot : null;
circle : float64;
rectangle : record { width : float64; height : float64 };
"💬" : text;
};
要么是一个点,要么是一个圆(有半径),要么是一个矩形(有尺寸),要么是一个气泡(有一些文本)。对话气泡说明了 unicode 标签名称 (💬) 的使用。
变体中的标签就像记录中的标签一样,实际上是数字,而字符串标签是指它们的哈希值。
通常,一些或全部标签不携带数据。然后使用null
类型是惯用的,如上dot
所示。事实上,Candid 通过允许您: null
在变体中省略类型注释来鼓励这一点,因此:
type season = variant { spring; summer; fall; winter }
相当于:
type season = variant {
spring : null; summer: null; fall: null; winter : null
}
并用于表示枚举。
类型variant {}
是合法的,但没有值。如果这是意图,则empty
类型可能更合适。
- 类型语法
variant {}
variant { ok : nat; error : text }
variant { "name with spaces" : nat; "unicode, too: ☃" : bool }
variant { spring; summer; fall; winter }
- 文本语法
variant { ok = 42 }
variant { "unicode, too: ☃" = true }
variant { fall }
-
亚型
变体类型的子类型是去掉了一些标签的变体类型,一些标签的类型本身变成了一个子类型。如果您希望能够在方法结果中的变体中添加新标签,则可以在变体本身包含在
opt …
. 这需要提前计划!当你设计一个界面时,而不是写:
service {
get_member_status (member_id : nat) -> (variant {active; expired});
}
最好使用这个:
service {
get_member_status (member_id : nat) -> (opt variant {active; expired});
}
这样,如果您以后需要添加honorary
会员状态,您可以展开状态列表。老客户将收到未知字段作为null
.
-
超类型
变体类型的超类型是带有附加标签的变体,并且可能某些标签的类型更改为超类型。
-
对应的元子类型
变体类型表示为 Motoko 变体类型,例如:
type Shape = {
#dot : ();
#circle : Float;
#rectangle : { width : Float; height : Float };
#_2669435721_ : Text;
};
请注意,如果标签的类型是null
,这对应()
于 Motoko,以保留将枚举建模为变体的各个惯用方式之间的映射。
-
对应的 Rust 类型
enum
用#[derive(CandidType, Deserialize)]
trait定义的用户。您可以使用该#[serde(rename = "DifferentFieldName")]
属性来重命名字段名称。 -
对应的 JavaScript 值
具有单个条目的记录对象。例如,
{ dot: null }
。如果字段名称是散列,我们使用_hash_
作为字段名称,例如,{ _2669435721_: "test" }
。
输入 func (…) → (…)
Candid 旨在支持高阶用例,其中服务可以接收或提供对其他服务或其方法的引用,例如作为回调。的func
类型是这一:表示该函数的签名(自变量和结果类型,注释),并且该类型的值是到与该签名功能的引用。
支持的注释是:
query
表示引用的函数是一个查询方法,这意味着它不会改变其容器的状态,并且可以使用更便宜的“查询调用”机制调用它。oneway
表示此函数不返回任何响应,用于即发即忘的场景。
有关参数命名的更多信息,请参阅命名参数和结果。
- 类型语法
func () -> ()
func (text) -> (text)
func (dividend : nat, divisor : nat) -> (div : nat, mod : nat);
func () -> (int) query
func (func (int) -> ()) -> ()
-
文本语法
目前,仅支持由其委托人确定的公共服务方法:
func "w7x7r-cok77-xa".hello
func "w7x7r-cok77-xa"."☃"
func "aaaaa-aa".create_canister
-
亚型
对函数类型的以下修改将其更改为服务升级规则中讨论的子类型:结果类型列表可以扩展。参数类型列表可能会缩短。参数类型列表可以用可选参数 (type
opt …
)进行扩展。现有的参数类型可能会更改为超类型!换句话说,函数类型在参数类型中是逆变的。现有的结果类型可能会更改为子类型。 -
超类型
对函数类型的以下修改将其更改为超类型:结果类型列表可能会缩短。结果类型列表可以用可选参数 (type
opt …
)进行扩展。参数类型列表可以扩展。现有参数类型可能会更改为子类型!换句话说,函数类型在参数类型中是逆变的。现有的结果类型可能会更改为超类型。 -
对应的元子类型
Candid 函数类型对应于
shared
Motoko 函数,结果类型包含在其中async
(除非它们被 注释,否则oneway
结果类型就是简单的()
)。参数分别。结果变成元组,除非正好有一个,在这种情况下直接使用它:
type F0 = func () -> ();
type F1 = func (text) -> (text);
type F2 = func (text, bool) -> () oneway;
type F3 = func (text) -> () oneway;
type F4 = func () -> (text) query;
对应于 Motoko
type F0 = shared () -> async ();
type F1 = shared Text -> async Text;
type F2 = shared (Text, Bool) -> ();
type F3 = shared (text) -> ();
type F4 = shared query () -> async Text;
-
对应的 Rust 类型
candid::IDLValue::Func(Principal, String)
,见IDLValue。 -
对应的 JavaScript 值
[Principal.fromText("aaaaa-aa"), "create_canister"]
Type service {…}
服务可能不仅要传递对单个函数的引用(使用func
type),还要传递对整个服务的引用。在这种情况下,可以使用 Candid 类型来声明此类服务的完整接口。
有关服务类型语法的更多详细信息,请参阅Candid 服务描述。
- 类型语法
service {
add : (nat) -> ();
subtract : (nat) -> ();
get : () -> (int) query;
subscribe : (func (int) -> ()) -> ();
}
- 文本语法
service "w7x7r-cok77-xa"
service "zwigo-aiaaa-aaaaa-qaa3a-cai"
service "aaaaa-aa"
-
亚型
服务类型的子类型是那些可能具有附加方法的服务类型,并且将现有方法的类型更改为子类型。这与在服务升级中讨论的升级规则完全相同。
-
超类型
服务类型的超类型是那些可能删除了某些方法的服务类型,并将现有方法的类型更改为超类型。
-
对应的元子类型
Candid 中的服务类型直接对应
actor
于 Motoko 中的类型:
actor {
add : shared Nat -> async ()
subtract : shared Nat -> async ();
get : shared query () -> async Int;
subscribe : shared (shared Int -> async ()) -> async ();
}
-
对应的 Rust 类型
candid::IDLValue::Service(Principal)
,见IDLValue。 -
对应的 JavaScript 值
Principal.fromText("aaaaa-aa")
Type principal
Internet Computer 使用主体作为识别容器、用户和其他实体的通用方案。
-
类型语法
principal
-
文本语法
principal "w7x7r-cok77-xa"
principal "zwigo-aiaaa-aaaaa-qaa3a-cai"
principal "aaaaa-aa"
-
对应的元子类型
Principal
-
对应的 Rust 类型
candid::Principal
或者ic_types::Principal
-
对应的 JavaScript 值
Principal.fromText("aaaaa-aa")
保留类型
该reserved
类型是一种具有一个(无信息) valuereserved
的类型,并且是所有其他类型的超类型。
该reserved
类型可用于删除方法参数。考虑具有以下签名的方法:
service {
foo : (first_name : text, middle_name : text, last_name : text) -> ()
}
并假设您不再关心middle_name
. 尽管 Candid 不会阻止您将签名更改为:
service {
foo : (first_name : text, last_name : text) -> ()
}
这将是灾难性的:如果客户使用旧界面与您交谈,您将默默地忽略last_name
并将middle_name
视为last_name
。请记住,方法参数名称只是约定,方法参数由它们的位置标识。
相反,您可以使用:
service {
foo : (first_name : text, middle_name : reserved, last_name : text) -> ()
}
表示foo
曾经采用第二个参数,但您不再关心它。
您可以通过采用这种模式来避免这个陷阱,任何预期具有变化参数的函数,或其参数只能通过位置而不是类型来区分,声明为采用单个记录。例如:
service {
foo : (record { first_name : text; middle_name : text; last_name : text}) -> ()
}
现在,将签名更改为:
service {
foo : (record { first_name : text; last_name : text}) -> ()
}
做正确的事情,您甚至不需要保留已删除参数的记录。
-
类型语法
reserved
-
文本语法
reserved
-
亚型
所有类型
-
对应的元子类型
Any
-
对应的 Rust 类型
candid::Reserved
-
对应的 JavaScript 值
任何值
输入空
empty
类型是没有价值的种类,并且是任何其它类型的子类型。
该empty
类型的实际用例相对较少。它可用于将方法标记为“永远不会成功返回”。例如:
service : {
always_fails () -> (empty)
}
-
类型语法
empty
-
文本语法
无,因为此类型没有值
-
超类型
所有类型
-
对应的元子类型
None
-
对应的 Rust 类型
candid::Empty
-
对应的 JavaScript 值
无,因为此类型没有值
语言服务器和开发客户端支持
最初由 Microsoft 开发的语言服务器协议 (LSP)提供了一种通用语言,可以向开发工具添加广泛有用的功能,例如自动代码完成、GoTo 定义和悬停工具提示。使用语言服务器协议,语言服务器可以实现编程语言与任何编辑器、集成开发环境 (IDE) 或客户端端点工具之间的标准化进程间通信。
由于语言服务器协议 (LSP) 对特定语言服务器和开发工具如何通信的协议进行了标准化,因此可以在多个开发工具中以最少的工作重用单个语言服务器。
为 Motoko 添加语言服务器
使用 DFINITY Canister SDK,dfx _language-service
当您在配置为识别语言服务器的编辑器或开发环境中打开 Motoko 程序时,您可以通过以编程方式调用 Motoko 的语言服务器到您的编辑器或开发环境客户端。您可以使用任何支持语言服务器协议的编辑器或集成开发环境以dfx _language-service
编程方式调用。一旦调用,语言服务器将确保您的开发环境报告 Motoko 编译器错误并提供代码完成和重构工具。
例如,如果您使用 Visual Studio Code (VSCode) 或 Emacs 作为您的开发环境,您可以安装一个插件扩展,使这些编辑器能够自动调用 Motoko 语言服务器。
手动调用语言服务
虽然直接在终端 shell 中启动 Motoko 语言服务器是非常罕见的。可以通过运行以下命令来做到这一点:
dfx _language-service --force-tty
请注意,您只能从项目目录中运行此命令。例如,如果您的项目名称是hello_world
,则您当前的工作目录必须是hello_world
顶级项目目录或其子目录之一。
基本用法
dfx _language-service [canister_name] [flag]
旗帜
您可以在dfx _language-service
命令中使用以下可选标志。
旗帜 | 描述 |
---|---|
--force-tty | 直接在终端 shell 中启动 Motoko 语言服务器。 |
-h , --help | 显示使用信息。 |
-V , --version | 显示版本信息。 |
参数
您可以为dfx _language-service
命令指定以下参数。
争论 | 描述 |
---|---|
canister_name | 指定编译器应监视的容器的名称。如果您指定容器名称,则该名称应与您在dfx.json 项目配置文件中配置的容器名称相匹配。如果不指定容器名称,则dfx.json 配置文件中指定的第一个容器将用作目标。 |
例子
如果要使用集成开发环境为容器开发代码,my-canister
则应让开发环境使用以下dfx _language-service
命令调用语言服务:
dfx _language-service my-canister
词汇表
-
actor
Actor 是现代编程语言中的一种特殊对象,它在隔离状态下处理消息,使它们能够被远程和异步处理。
-
canister
容器是类似于智能合约的概念对象,具有通用唯一标识符和定义特定应用程序、服务或微型站点边界的所有者。容器封装了所有的编程逻辑、公共入口方法、提供的消息类型的接口描述以及它描述的应用程序、服务或微服务的状态信息。
-
controller
控制器是一种身份,具有管理其控制的容器的特殊权限。例如,只有控制身份可用于安装、升级或删除其控制下的容器。您可以使用与用户或容器关联的主体的文本表示(通常称为主体标识符)来指定控制器身份。
-
ledger
互联网计算机将所有涉及 ICP 代币的交易记录在一个称为账本容器的专门管理容器中。分类账容器是一个简化的并行区块链,它与其他网络管理容器一起在子网中的互联网计算机上运行。分类账容器实现了一个智能合约,该合约持有账户和余额,并保留影响账户和余额的交易历史。记录交易以跟踪以下特定事件:为账户铸造 ICP 代币。将 ICP 代币从一个账户转移到另一个账户。燃烧 ICP 代币以消除它们的存在。
-
node
作为互联网计算机区块链网络的注册成员并运行互联网计算机副本进程的物理计算机。
-
principal
首次使用 DFINITY Canister SDK 时,
dfx
命令行工具会default
使用 PEM 文件中的公钥/私钥对为您创建开发人员身份。此 Internet 计算机开发人员身份在内部由派生的主体数据类型和主体的文本表示形式表示,通常称为主体标识符。开发人员身份还可用于派生**帐户标识符——**类似于比特币或以太坊地址——以代表你在互联网计算机分类账容器中持有 ICP 代币。 -
replica
在互联网计算机区块链的上下文中,副本是指在网络中的物理计算机节点上运行的互联网计算机进程(例如
replica
,nodemanager
、 和其他较低级别的互联网计算机协议进程)。对于 DFINITY Canister SDK,您使用dfx start
和dfx stop
命令在replica
本地启动和停止进程,为开发提供本地网络。 -
smart contract
智能合约是一种软件,可以在不需要任何中央机构或法律系统的情况下,在分布式、去中心化的区块链网络上执行可信交易和协议。通过智能合约,交易或协议的条款直接写入在区块链网络上执行的代码行中。代码控制执行,交易防篡改、可追溯、不可逆。在互联网计算机上,智能合约被部署为容器。
-
wallet
在 Internet 计算机上,钱包是一种专门的应用程序,可让您存储和检索您的数字资产。钱包应用程序被实现为一个在互联网计算机上运行的容器。钱包使您能够管理您的 ICP 代币余额,将 ICP 代币转换为周期,并将周期分发到您自己或其他用户的容器中,作为访问或提供互联网服务的一种方式。
-
WebAssembly
WebAssembly (
Wasm
) 是一种低级计算机指令格式。因为 WebAssembly 定义了一种可移植的、开放标准的二进制格式,可以在大多数现代计算机硬件上清晰地抽象出来,所以它广泛支持在 Internet 上运行的程序。用 Motoko 编写的程序被编译为 WebAssembly 代码,以便在 Internet 计算机副本上执行。