准备
开发工具 Remix
实例代码PatrickAlphaC/simple-storage-fcc (github.com)
solidity
部署后,每一个合约都有一个地址。(就像账户地址)
部署一个合约其实就是发送一个交易。
一、代码
//contract 就类似于java的class
contract SimpleStorage {
//public 实际上就是创建了一个getter函数。
//隐式的定义为storage
uint256 public favNumber=0;
function store(uint256 _favNumber) public {
favNumber = _favNumber;
}
function retrieve() public view returns(uint256) {
return favNumber;
}
}
二、访问权限
合理的设置访问权限才能避免漏洞。
public/private
public 实际上就是创建了一个getter函数favNumber(),
private表示这个合约是唯一可以调用favNumber()的合约。
external
只对合约外部可见
internala
只有这个合约或者继承他的合约可以读取。
三、storage/state
四、函数标识
红色store调用会产生gas,表示有修改合约状态,
只有更改合约状态的时候才支付gas(transaction cost,不是execution cost),发生交易。
view
只会读取这个合约的状态(比如favNumber)。
view函数不允许修改任何状态,不会产生gas。
当 retrieve()被store调用时,那他就需要支付retrieve() 的execution cost gas
pure
连合约状态都没读取,只做简单的内存运算
pure函数也不允许修改任何状态。
不允许读取区块链 数据(所以不能)。
总结
调用view函数是免费的,除非你在消耗gas的函数中调用它。
五、变量的数据位置
函数入参、局部变量 需要指定变量的数据位置(memory,calldata),如
memory和calldata意味着这个变量只是暂时存在,只在调用此addPerson()函数的交易期间暂时存在。
storage 存储变量甚至存在于正在执行的函数之外。
memory
可以被修改的临时变量,string,数组,结构,映射才需要加memory。
uint 不用加meory,默认就是。
calldata
类似memory,但是不可以修改的临时变量
storage
如 全局变量uint256 public favNumber=0; 隐式的定义为storage。
六、部署
部署到NetaMask钱包正在连接的测试网络上
确保先用测试水龙头领取一些代笔,部署需要支付gas。
点击部署,此时MetaMask插件会有提示,点击打开
点击确认
可以看到,合约已经通过 account1账号部署到测试链上。
from就是account1地址。
to就是 刚刚创建的合约地址,可以点击打开。
可以看到gas limit 和gas usage比单纯发送以太币(23000gas)高得多。
可以看到该合约下面的第一个交易:创建合约。
可以在Remix上点击按钮,在测试网络上做一遍测试。
点击retrieve这种view函数不需要gas,所以浏览器MetaMask插件不会弹出。
点击store这种会修改区块链的函数需要gas,所以浏览器MetaMask插件会弹出来确认(在etherscan上能看到store这个交易)。
测试链的部署可能需要等待挺久时间,所以一开始先在本地
的RemixVM(Shanghai)上调试,然后再部署到测试链Injected Provider。
添加两个用户addPerson ,需要MetaMask弹窗两次确认才可以执行。结果如下:
七、切换测试网络
MetaMask里切换就行,Remix会自动感应。
八、按钮颜色类型
蓝色:view方法,不会修改链内容,免费。
橙色:有修改链内容,支付gas。
红色:有转账行为 payable,方法内会用到 msg.value。
例如 FundMe 的fund() 函数。
如果只是接收币,还是橙色如 withDraw
九、继承、重写
- 用is 表示继承,重写时 父类 virtual ,子类 override。
- 支持多继承。
contract SimpleStorage {
function store(uint256 _favoriteNumber) public virtual {
favoriteNumber = _favoriteNumber;
retrieve();
}
}
import "./SimpleStorage.sol";
contract ExtraStorage is SimpleStorage {
function store(uint256 _favoriteNumber) public override {
favoriteNumber = _favoriteNumber + 5;
}
}