本文档介绍了合约编写的基础知识,包括合约初始化、action和权限的相关知识。适用于想要了解智能合约编写基础知识的初学者和开发者,帮助其快速了解和上手EOS智能合约的编写。作为智能合约的基础篇,本文仅涉及合约初始化、action和权限方面的内容。
01
智能合约介绍
区块链作为一种分布式可信计算平台,去中心化是其最本质的特征。每笔交易的记录不可篡改地存储在区块链上。智能合约中定义可以在区块链上执行的动作action和交易transaction的代码。可以在区块链上执行,并将合约执行状态作为该区块链实例不可变历史的一部分。
因此,开发人员可以依赖该区块链作为可信计算环境,其中智能合约的输入、执行和结果都是独立的,不受外部影响。
02
合约编写基础知识介绍
(一)合约初始化
1、合约的构造函数
在EOSIO中,智能合约通过C++编写,并通过WASM(WebAssembly)字节码形式部署到区块链网络上。当部署完成后,可以调用合约的action执行相应的操作。在合约被部署后,会自动执行其初始化函数,以初始化合约的数据和状态。
智能合约的构造函数是在合约部署时被调用的,用于初始化合约的状态和数据。构造函数是一个特殊的成员函数,它没有返回值类型,且函数名与合约名相同。
以下是一个简单的EOS智能合约的构造函数示例:
#include <eosio/eosio.hpp>
using namespace eosio;
class [[eosio::contract("hello")]] hello : public contract {
public:
hello(name receiver, name code, datastream<const char*> ds)
: contract(receiver, code, ds) {
eosio::print_f("hello is ready. ");
}
};
在上述代码中,构造函数的参数包括:
-
receiver:合约实例的接收者,指定该实例的账户名。
-
code:合约所属的账户名。
-
ds:数据流对象,用于序列化和反序列化合约数据。通常在构造函数中会使用它来初始化合约的状态。
构造函数必须继承自contract类,并调用contract类的构造函数来初始化合约状态和数据。
在构造函数中,你可以执行各种初始化操作,例如分配初始资源,初始化数据结构,加载配置等等。
需要注意的是,constructor函数只会在合约部署时执行一次,之后无法再次执行。因此,合约构造函数对于初始化合约状态以及设置合约的权限和授权等功能至关重要。如果需要修改合约的数据和状态,需要通过action来调用其他函数。
2、ds
ds的全称为datastream,是一个用于读写字节形式的数据流。数据流对象是EOS智能合约中的一个重要对象,用于序列化和反序列化合约数据。在EOS中,合约与区块链节点通信时需要将数据序列化为二进制格式,同时在合约内部也需要将二进制格式的数据反序列化为对应的数据类型进行处理。ds可以帮助合约开发人员方便地实现这些数据序列化和反序列化操作。
(1)ds的使用场景
-
作为智能合约构造函数的参数
在智能合约中,ds用于序列化和反序列化合约数据。通常在构造函数中会使用它来初始化合约的状态。
-
在智能合约中读取和写入参数
在智能合约中,通常需要读取和写入一些参数,例如在调用一个合约的action时需要传入一些参数,或者在向表中添加数据时需要指定一些字段值。对于这些参数,可以使用ds对它们进行序列化和反序列化,以便在智能合约中进行处理。
-
与其他合约进行通信
在EOSIO中,多个合约可以相互调用和通信。当需要将数据传递给其他合约时,可以使用ds将数据进行序列化,以便在不同合约之间传递二进制数据流。
-
在智能合约中处理复杂的数据类型
在智能合约中,您可以自定义一些复杂的数据类型,例如结构体、对象等等。当需要在智能合约中处理这些复杂的数据类型时,可以使用ds对它们进行序列化和反序列化,以便在智能合约中进行处理。
(2)使用ds的好处
-
易于序列化和反序列化:使用ds对象,可以方便地将各种数据类型序列化为二进制格式,或者将二进制格式反序列化为对应的数据类型。这对