以太坊智能合约开发:Solidity 语言快速入门
Posted StevenX5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊智能合约开发:Solidity 语言快速入门相关的知识,希望对你有一定的参考价值。
在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。
开始之前
在开始之前,我们先对Solidity有个初步的了解,即Solidity是什么?
让我们看一下官方的描述:
- Solidity是一种面向对象(合约)的,为实现智能合约而创建的高级编程语言;
- Solidity是一种针对以太坊虚拟机(EVM)设计的语言,它受到了C++、Python和javascript的影响;
- Solidity是一种静态类型语言,支持复杂的用户定义编程,支持库和继承。
合约样例
下面是一个简单的合约例子,我们用来演示如何用Solidity编写一个简单的智能合约。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 第一个合约
contract HelloWorld
// 状态变量
string public str = "Hello World!";
// set 函数
function set(string memory s) public
str = s;
// get 函数
function get() public view returns(string memory)
return str;
合约结构
版权许可
// SPDX-License-Identifier: MIT
版本许可位于源文件中的第1行,用于定义合约的版权许可标识。虽然不是强制的,但我们建议在每个源文件中都应该以这样的代码开始,来说明合约的版权许可证。如果你不想指定一个许可证,或者如果源代码不开源,请使用特殊值 UNLICENSED
。
版本标识
pragma solidity ^0.8.13;
版本标识位于源文件中的第2行,用于定义Solidity的版本,其中 pragma
是定义版本标识的关键字。
这行代码表示不允许低于 0.8.7
版本的编译器编译,也不允许高于 0.9.0
的编译器编译,即使用的编译器版本介于 0.8.7 与 0.9.0之间。
Solidity编译器版本规范如下:
序号 | 版本规范 | 说明 |
---|---|---|
1 | ^0.5.1 | 指定的主版本号下所有更新的版本。即匹配 0.5.1 ~ 0.6.0 之间的版本 |
2 | ~0.5.1 | 指定的主版本号与次版本号下所有更新的版本。即匹配 0.5.1 ~ 0.5.9 之间的版本 |
3 | >=0.5.1 | 版本号大于等于0.5.1,匹配 >=0.5.1 的所有版本 |
4 | <=0.5.1 | 版本号小于等于0.5.1,匹配 <=0.5.1 的所有版本 |
5 | x | 匹配所有版本 |
6 | 0.5或0.5.x | 匹配指定主版本号与次版本号下的所有版本 |
截止到目前,Solidity的编译器版本已更新到 0.8.15
。我们建议在编译部署合约时,应该尽量使用最新版本,因为新版本会有一些新特性以及bug修复。
合约类(对象)
contract HelloWorld
// 函数和数据
在Solidity语言中,合约类似于其他面向对象编程语言中的类。contract
是定义合约类的关键字,HelloWorld
是合约名称。我们建议合约名称和本地文件名用同一个名称,且第一个字母大写。
合约还可以从其他合约继承,可以是一些特殊的合约,比如库(library)和接口(interface)。这些知识点我们会在后续的课程中讲解。
状态变量
string public str = "Hello World!";
这段代码中的 str
就是一个状态变量,它是一个永久存储在合约存储中的值。
函数
function set(string memory s) public
function get() public view returns(string memory)
函数是合约代码的可执行单元,函数通常在合约内部定义。函数一般有以下几部分组成:
- 函数名
- 参数
- 返回值
在样例代码中,我们定义了2个函数:
set()
:用于设置状态变量的值;get()
:用于返回状态变量的值。
注释
合约中的注释有单行注释(//
)和多行注释(/*...*/
)两种,和C++的注释类似。
// 这是一个单行注释
/*
这是一个
多行注释
*/
合约部署
我们推荐使用Remix来开发简单合约。
Remix 是一个合约开发和编译器,可以在线使用,而无需安装任何东西。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hv3XOyUM-1669021104665)(D:\\资料\\我的\\项目\\IT培训项目\\区块链\\课程\\Solidity语言基础教程\\images\\remix.png)]
我们在Remix中编译、部署和运行这个样例合约。执行结果如下图:
智能合约从入门到精通:用Solidity开发一个“Hello World”
简介:上一章中我们聊到了智能合约的应用场景,在了解区块链技术目前的发展情况、智能合约的概念以及其应用场景之后,我们将在后续的文章中共同学习智能合约的编成语言。今天,我们就来简单地谈一谈用于编写智能合约的语言——Solidity语言。
那么,什么是Solidity语言呢?在前面的文章中我们反复提到过以太坊,以太坊做区块链2.0的典型代表,Solidity在以太坊中是撰写智能合约最受欢迎的语言,因此今天我们就和大家介绍一下这个作为智能合约开发中最主流的语言。
Solidity是运行于Ethereum虚拟机(EVM)上的一种智能合约高级语言。它的语法与Javascript相似,是一种面向对象的语言。但其作为一种真正意义于网络上运行中的去中心合约,它又有着各种各样的特别之处,以下我们列举了其中的一部分,以便大家能够更直观地去理解Solidity语言的特点。
1. Solidity语言中,以太坊的底层构造是基于帐户而非UTXO的,所以它有一个特殊的Address的类型,用于用户、合约以及合约代码的定位(而合约其本身也是一个帐户)。
2. Solidity语言具备着语言内嵌框架支持支付的特点,它提供了一系列诸如payable的关键字,可以在语言的层面上直接进行支付,在运用上快捷简便。
3. 存储。Solidity语言的存储使用的是网络上现有的区块链,数据的每一个阶段、状态都可以得到永久的存储,所以需要明确变量使用内存还是区块链。
4. 关于Solidity的运行环境,其运行环境是建立在去中心化的网络上的,强调的是合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络中节点的代码执行,有着分布式的特点。
5.最后,Solidity语言有着一个十分特殊的异常处理机制。在过程中一旦出现任何异常,所有的执行都将会被强制回撤,这一机制有效避免了中间状态突然出现数据不一致的情况,从而保证合约执行的原子性。
Hello World作为在《The C Programme Language》中使用的第一个演示程序,在编程的世界里听起来也许非常高端,但实际上想要上手玩转其实非常地简单:
pragma solidity ^0.4.0;
contract HelloWorld{
uint balance;
function update(uint amount) returns (address, uint){
balance += amount;
return (msg.sender, balance);
}
}
如上所示,通过读取参数输入的新值,并将其累加至合约的变量中,返回发送人的地址,和最终的累计值。
最后,在这里给大家介绍一款浏览器编译器——Remix。
浏览器编译器Remix可谓称得上是Solidity语言的开发神器,是一个无需安装即可使用的在线编译器。只需打开其网址,即可在线使用并看到具体效果。打开后,如下图所示:
输入上述代码,点击Create按钮,就能在浏览器中创建能调用函数的按钮。在智能合约从入门到精通:用Solidity开发一个“Hello World”