跳至主要内容
此页面是从英文翻译而来的。请注意,与原始页面相比,可能会出现错误或差异。真实的文档来源应始终是英文版本。

变量

定义变量是任何编程语言的基本组成部分。在本节中,我们将看看 您可以在EOS智能合约中定义的不同类型的变量。

C++ 支持多种数据类型。EOS++ 使用特定于 EOS 的类型扩展了类型集。

定义变量

变量的定义方式与 C++ 中的定义方式相同。

function main() {
// <type> <name> = <value>;
int a = 5;
}

基本类型

这些是 C++ 内置的基本类型。你以前可能使用过这种类型的某种形式 在你使用过的其他编程语言中。

除非另有说明,否则以下类型是从 <eosio/eosio.hpp> 标题。

#include <eosio/eosio.hpp>

整数类型

整数类型用于表示整数。它们可以是有符号的(正数或负数),也可以是无符号的(仅限正数)。

整数类型
bool
int8_t
int16_t
int32_t
int64_t
int128_t
uint8_t
uint16_t
uint32_t
uint64_t
uint128_t

必填标题

#include <eosio/varint.hpp>
整数类型
signed_int
unsigned_int

浮点类型

浮点类型用于表示十进制数。

警告

浮点类型并不精确。它们不适合存储货币价值,而且通常是 存储其他类型的数据也有问题。请谨慎使用它们,尤其是在处理时 区块链。

浮动类型描述
float32 位浮点数
double64 位浮点数

字节类型

字节类型用于表示原始字节序列,例如二进制数据/字符串。

Blob 类型描述
bytes原始字节序列
string字符串

时间类型

时间类型用于表示时间,特别是与区块相关的时间。

时间类型描述
time_point以微秒为单位的时间点
time_point_sec时间点(以秒为单位)
block_timestamp_type区块时间戳

哈希类型

哈希类型用于表示加密哈希,例如 SHA-256。

校验和类型描述
checksum160160 位校验和
checksum256256 位校验和
checksum512512 位校验和

自定义类型

这些是 EOS++ 内置的自定义类型。您可能会经常在EOS智能合约中使用其中一些类型。

名称类型

那个 name type 用于表示账户名称。它是 64 位整数,但显示为字符串。

各种系统函数都需要将名称作为参数。

有三种方法可以将字符串转换为名称:

  • name{"string"}
  • name("string")
  • "string"_n

如果你想获得 uint64_t 名称的值,可以使用 value 方法。

name a = name("hello");
uint64_t b = a.value;

密钥和签名类型

那个 public_keysignature 类型用于表示加密密钥和签名,并且是 也是 EOS++ 特定的类型。

必填标题

#include <eosio/crypto.hpp>

从签名中恢复密钥

function recover(checksum256 hash, signature sig) {
public_key recovered_key = recover_key(hash, sig);
}

资产类型

那个 asset type 用于表示数字资产的数量。它是一个带符号的 64 位整数,但显示为字符串。

它具有抗溢出和下溢的能力,并且具有多种方法可以轻松执行算术运算。

必填标题

#include <eosio/asset.hpp>
资产类型描述
symbol资产符号
symbol_code资产符号代码
asset资产

创建资产

资产分为两部分:数量和符号。数量为 64 位整数,符号为 是字符串和精度的组合。

// symbol(<symbol (string)>, <precision (1-18)>)
symbol mySymbol = symbol("TKN", 4);

// asset(<quantity (int64_t)>, <symbol>)
asset myAsset = asset(1'0000, mySymbol);

执行算术运算

您可以轻松地对资产进行算术运算。

asset a = asset(1'0000, symbol("TKN", 4));
asset b = asset(2'0000, symbol("TKN", 4));

asset c = a + b; // 3'0000 TKN
asset d = a - b; // -1'0000 TKN
asset e = a * 2; // 2'0000 TKN
asset f = a / 2; // 0'5000 TKN

??符号匹配

对具有不同符号的资产进行算术运算会引发错误,但仅限于运行时。确保 您总是使用相同符号对资产进行操作。

资产方法

您可以使用将资源转换为字符串 to_string 方法。

std::string result = a.to_string(); // "1.0000 TKN"

您也可以使用以下方法获取资产的数量和符号 amountsymbol 方法。

int64_t quantity = a.amount; // 1'0000
symbol sym = a.symbol; // symbol("TKN", 4)

使用资产时,您始终需要确保其有效(金额在范围内)。

bool valid = a.is_valid();

符号方法

您可以使用将符号转换为字符串 to_string 方法。

std::string result = mySymbol.to_string(); // "4,TKN"

你也可以得到未加工的 uint64_t 使用符号的值 value 方法。

uint64_t value = mySymbol.value;

单独使用符号时,您始终需要确保其有效。但是,在使用资产时,它已经检查了 符号本身的有效性 is_valid 方法。

bool valid = mySymbol.is_valid();

结构

结构用于表示复杂数据。它们与类类似,但更简单、更轻便。想一想 JSON 对象。

你可以在 EOS++ 中使用它们,但如果你将它们存储在表中,你应该使用 TABLE 我们将在中讨论的关键字 下一节.

struct myStruct {
uint64_t id;
};