访问Remix官网,选择Solidity,新建文件,命名为 Count.sol

把如下代码写入Count.sol

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pragma solidity ^0.5.11;
//第一行告诉编译器需要用哪个版本的Solidity,版本前面加上^表示可以使用比该版本新的近似版本。
//比如^0.5.11表示可以使用0.5.11及更新的版本,但不能是0.6.X。

//contract 关键词,定义一个合同,所有在合同外的代码不会被执行。
contract Count{

//uint定义一个unsigned integer,取值0~2^256
//public表示在合同外也可以访问。
uint public count;

//constructor定义一个构造器,只在合同第一次部署的时候运行,之后便不再会运行。
//可以在里面设定一些以后不会被改变的值,或者可以定义只有某个地址才有权访问合同中的某些函数。
//该构造器需要一个输入 _count,即在第一次部署合同时需要赋值。
constructor(uint _count) public {
count = _count;
}

//定义一个函数increment,无需输入
//external和public类似,但是需要消耗的gas更少,更多的区别日后讨论
function increment() external {
count ++;
}

function decrement() external {
count --;
}
}

选择左侧编译器版本,点击Compile:

编译完成后,点击左侧Deploy图标,环境选择 JavaScript VMJavaScript VM是在本地测试运行,包括5个有100ether的账号供我们测试。选择Injected Web3可以连接MetaMask的Test Network或者Main Network。

Gas Limit可以不改,防止合约中有死循环把钱花光了。Value是真实的ether,需要转账的话要在value中赋值。Contract中只有一个合约,就是我们写的Count。Deloy后面需要给定输入,因为我们的构造器需要一个输入。我们这里填2,然后点击Deploy。

部署完成后会发现账户中的钱变成99.99999…ether了。因为部署智能合约需要花费一定的ether。随后看到下方有三个按钮,其中decrementincrement就是我们合约中的两个函数了,可以点这个函数让count的值加一或减一。每次调用函数都需要花费一定的ether。最后蓝色的count按钮可以让我们查看变量当前的值。因为我们设置count是public,所以所有人都可见。查看变量的值不需要花费ether。

这里存在一个潜在的风险,我们设定count变量的取值是非负的,如果一直调用减法,当count值小于0时,会反过来变成uint取值范围的最大值。在真正编写智能合约时一定要注意此类问题。(这里就不改了hhh)

至此,我们完成了第一个Solidity编写的智能合约。当然,这个合约并没有被部署到Test Network或者Main Network上,只是在本地测试一下。大家也可以试着在Account中切换账户随意调用函数试一试。


注:本篇文章为本人学习笔记,仅供参考。其中难免会有理解错误,请大家结合其他材料学习。如有发现错误,欢迎在评论区指出~