智能合约结构

深入解读智能合约:函数、数据和变量。

智能合约是一种在MAPO-Relay-Chain某个地址上运行的程序。 它们是由数据和函数组成的,可以在收到交易时执行。 以下概述一个智能合约的组成。以下MAPO-Relay-Chain统称为MAPO.

前置要求

确保您已经先阅读了智能合约。 本文档假设您已经熟悉某种编程语言,例如 JavaScript 或 Python。

数据

任何合约数据必须分配到一个位置:要么是存储,要么是内存。 在智能合约中修改存储消耗很大,因此您需要考虑数据在哪里存取。

存储

持久性数据被称之为存储,由状态变量表示。 这些值被永久地存储在区块链上。 您需要声明一个类型,以便于合约在编译时可以跟踪它在区块链上需要多少存储。

// Solidity example
contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

如果用过面向对象编程语言,应该会熟悉大多数类型。 但如果是刚接触MAPO开发,则会发现 address 是一个新类型。

一个 address 类型可以容纳一个MAPO地址,相当于 20 个字节或 160 位。 它以十六进制的形式返回,前导是 0x。

其它类型包括:

  • 布尔

  • 整数(integer)

  • 定点数(fixed point numbers)

  • 固定大小的字节数组(fixed-size byte arrays)

  • 动态大小的字节数组(dynamically-sized byte arrays)

  • 有理数和整数常量(Rational and integer literals)

  • 字符常量(String literals)

  • 十六进制常量(Hexadecimal literals)

  • 枚举(Enums)

了解更多信息,请参阅文档:

内存

仅在合约函数执行期间存储的值被称为内存变量。 由于这些变量不是永久地存储在区块链上,所以它们的使用成本要低得多。

Solidity 文档中了解更多关于EVM虚拟机如何存储数据(存储、内存和栈)。

环境变量

除了在自己合约上定义的变量之外,还有一些特殊的全局变量。 它们主要用于提供有关区块链或当前交易的信息。

示例:

属性

状态变量

描述

block.timestamp

uint256

当前区块的时间戳

msg.sender

地址

消息的发送者(当前调用)

函数

用最简单的术语来说,函数可以获得信息或设置信息,以响应传入的交易。

有两种函数调用方式:

  • internal – 不会创建EVM虚拟机调用

    • Internal 函数和状态变量只能在内部访问(只能在合约内部或者从其继承的合约内部访问)。

  • external – 会创建EVM虚拟机调用

    • External 函数是合约接口的一部分,这意味着他可以被其它合约和交易调用。 一个 external 函数 f 不可以被内部调用(即 f() 不行,但 this.f() 可以)。

它们可以是 publicprivate

  • public 函数可以在合约内部调用或者通过消息在合约外部调用

  • private 函数仅在其被定义的合约内部可见,并且在该合约的派生合约中不可见。

函数和状态变量都可以被定义为 public 或 private

下面是更新合约上一个状态变量的函数:

  • string 类型的参数 value 传入函数 update_name

  • 函数声明为 public,意味着任何人都能访问它

  • 函数没有被声明为 view,因此它可以修改合约状态

View 函数

这些函数保证不会修改合约数据的状态。 常见的示例是 "getter" 函数 - 例如,它可以用于接收用户的余额。

这些操作被视为修改状态:

  1. 写入状态变量。

  2. 使用 selfdestruct

  3. 通过调用发送 ether。

  4. 调用任何未标记为 viewpure 的函数。

  5. 使用底层调用。

  6. 使用包含某些操作码的内联程序组。

构造函数

constructor 函数只在首次部署合约时执行一次。 与许多基于类的编程语言中的 constructor 函数类似,这些函数常将状态变量初始化到指定的值。

内置函数

除了自己在合约中定义的变量和函数外,还有一些特殊的内置函数。 最明显的例子是:

  • address.send() – Solidity

这使合约可以发送MAPO币给其它帐户。

编写函数

您的函数需要:

  • 参数变量及其类型(如果它接受参数)

  • 声明为 internal/external

  • 声明为 pure/view/payable

  • 返回类型(如果它返回值)

一个完整的合约可能就是这样。 在这里,constructor 函数为 dapp_name 变量提供了初始化值。

事件和日志

事件可以让您通过前端或其它订阅应用与您的智能合约通信。 当交易被挖矿执行时,智能合约可以触发事件并且将日志写入区块链,然后前端可以进行处理。

附带说明的例子

这是一些用 Solidity 写的例子。 如果希望运行这些代码,您可以在 Remix 中调试。

Hello world

代币(Token)

唯一的数字资产

延伸阅读

查阅 Solidity文档,以获得关于智能合约的更完整概述:

Last updated