详解智能合约
智能合约是一种在以太坊某个地址上运行的程序。 它们是由数据和函数组成的,可以在收到交易时执行。 以下概述一个智能合约的组成。
前置要求
确保您已经先阅读了智能合约。 本文档假设您已经熟悉某种编程语言,例如 JavaScript 或 Python。
数据
任何合约数据必须分配到一个位置:要么是存储
,要么是内存
。 在智能合约中修改存储消耗很大,因此您需要考虑数据在哪里存取。
存储
持久性数据被称之为存储,由状态变量表示。 这些值被永久地存储在区块链上。 您需要声明一个类型,以便于合约在编译时可以跟踪它在区块链上需要多少存储。
1// Solidity example2contract SimpleStorage {3 uint storedData; // State variable4 // ...5}6复制
1# Vyper example2storedData: int1283复制
如果用过面向对象编程语言,应该会熟悉大多数类型。 但如果是刚接触以太坊开发,则会发现 address
是一个新类型。
一个 address
类型可以容纳一个以太坊地址,相当于 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 文档(opens in a new tab)中了解更多关于以太坊虚拟机如何存储数据(存储、内存和栈)。
环境变量
除了在自己合约上定义的变量之外,还有一些特殊的全局变量。 它们主要用于提供有关区块链或当前交易的信息。
示例:
属性 | 状态变量 | 描述 |
---|---|---|
block.timestamp | uint256 | 当前区块的时间戳 |
msg.sender | 地址 | 消息的发送者(当前调用) |
函数
用最简单的术语来说,函数可以获得信息或设置信 息,以响应传入的交易。
有两种函数调用方式:
internal
– 不会创建以太坊虚拟机调用- Internal 函数和状态变量只能在内部访问(只能在合约内部或者从其继承的合约内部访问)。
external
– 会创建以太坊虚拟机调用- External 函数是合约接口的一部分,这意味着他可以被其它合约和交易调用。 一个 external 函数
f
不可以被内部调用(即f()
不行,但this.f()
可以)。
- External 函数是合约接口的一部分,这意味着他可以被其它合约和交易调用。 一个 external 函数
它们可以是 public
或 private
public
函数可以在合约内部调用或者通过消息在合约外部调用private
函数仅在其被定义的合约内部可见,并且在该合约的派生合约中不可见。
函数和状态变量都可以被定义为 public 或 private
下面是更新合约上一个状态变量的函数:
1// Solidity example2function update_name(string value) public {3 dapp_name = value;4}5复制
string
类型的参数value
传入函数update_name
- 函数声明为
public
,意味着任何人都能访问它 - 函数没有被声明为
view
,因此它可以修改合约状态