我有一壶酒,足以慰平生。

0%

solidity学习笔记

一、Solidity 语言

Solidity 是一种智能合约高级语言,运行在 Ethereum 虚拟机(EVM:Ethereum Virtual Machine)之上。
Solidity 的语法接近于 Javascript,是一种面向对象的语言,而且围绕着 Solidity 的各种开发工具链,都是使用属于 Javascript 生态系的 npm 来提供的。

Solidity语言:http://www.tryblockchain.org
Solidity documentation:https://solidity.readthedocs.org
GitHub:https://github.com/ethereum/solidity

二、编辑器

我目前是使用 Atom 搭配 solidity(linter-solium和autocomplete-solidity) 插件来开发。

三、Truffle 框架

Truffle 是针对基于以太坊的 Solidity 语言的一套开发框架,本身基于 Javascript。

四、工具安装

见另一篇博客win10搭建以太坊开发环境及truffle框架

五、启动 Ganache客户端

image-20200621100049242

可以看到启动后自动建立了10个帐号(Accounts),与每个帐号对应的私钥(Private Key)。每个帐号中都有100个测试用的以太币(Ether)。

六、创建初始化项目

在空目录下打开cmd输入 truffle init 构建初始化项目。

目录结构:

  • contracts/:Truffle默认的合约文件存放地址;
  • migrations/:存放发布的脚本文件;
  • test/:存放测试应用和合约的测试文件;
  • truffle.js 和 truffle-config.js:Truffle的配置文件。

七、新建 HelloWorld 合约

contracts 文件夹下新建 Demo.sol 文件,合约内容如下:

image-20200621100413979

讲解:

1
pragma solidity 0.5.16;

第一行指名目前使用的 solidity 版本,不同版本的 solidity 可能会编译出不同的 bytecode。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
contract Demo{
//构造方法
constructor() public {

}
//sayHello 写死
function sayHello() public pure returns (string memory){
return ("hello world!");
}

//echo 接受一个参数 然后返回
function echo(string memory _name) public pure returns (string memory){
return _name;
}
}

contract 关键字类似于其他语言中较常见的 class。因为solidity 是专为智能合约(Contact)设计的语言,声明 contract 后即内置了开发智能合约所需的功能。也可以把这句理解为 class Demo extends Contract

函数的结构与其他程序类似,但如果有传入的参数或回传值,需要指定参数或回传值的类型(type)。

八、编译合约

现在执行 truffle compile 命令,我们可以将 HelloWorld.sol 原始码编译成 Ethereum bytecode

1
2
$ cd ..`
`$ truffle compile

命令运行成功后会多出一个 build 的目录,如下:

image-20200621101128429

build 目录

HelloWorld 文件夹下面的 build/contracts 文件夹下面会看见 HelloWorld.json 文件:

image-20200621101435329

Demo.json

十、修改 truffle.js 文件内容:

添加以下内容到 truffle.js 文件并保存 :

1
2
3
4
5
6
7
networks: {
development: {
host:"localhost",
port:7545,
network_id:"*" // 匹配任何network id
}
}

修改 truffle.js 文件

十一、部署合约

migrations 目录下创建移植文件:

image-20200621101633945

创建移植文件

修改文件内容如下:

1
2
3
4
5
6
7
const Demo = artifacts.require("Demo");
//使用 artifacts.require 语句来取得准备部署的合约

module.exports = function(deployer){
deployer.deploy(Demo);
//使用deployer.deploy 语句将合约部署到区块链上。
};

修改移植文件内容

使用 artifacts.require 语句来取得准备部署的合约。
使用deployer.deploy 语句将合约部署到区块链上。
这边Democontract 的名称而不是文件名。
因此可以用此语法读入任一 .sol 文件中的任一合约。

现在执行 truffle migrate 命令:

1
$ truffle migrate

部署合约

部署成功你会看到 Ganache中生成了新的区块,表示已经将合约部署到区块链上了。

image-20200621101919044

十二、与合约互动

Truffle 提供命令行工具,执行 truffle console 命令后,可用Javascript 来和刚刚部署的合约互动:

1
2
3
$ cd ..`
`$ truffle console`
`$ Demo.deployed().then(instance => c = instance)

与合约互动

image-20200621102333408

讲解:

1
Demo.deployed().then(instance => c = instance)

truffle console 中预载了 truffle-contract 函数库,以方便操作部署到区块链上的合约。
这边使用 Demo.deployed().then 语句来取得 Demo合约的 Instance(实例),并存到 contract 变量中,以方便后续的调用。

输入以下命令:

1
2
c.echo("hello solidity")
c.sayHello()

image-20200621102546448

这里直接呼叫 contract.sayHello.call() 也会得到一样的结果。truffle-contract 提供使用 call() 来读取只读 (read only) 的数据,这样就不需提供 gas。因此如果遇到的操作需要向区块链写入数据,我们就不能用 call 语句了。

如此一来,我们已写好并部署完成了第一个智能合约,也验证了合约确实可以运作。

您的支持是我继续创作的动力