区块链全栈以太坊(三)合约编写

准备

开发工具 Remix

实例代码PatrickAlphaC/simple-storage-fcc (github.com)

solidity

部署后,每一个合约都有一个地址。(就像账户地址)

部署一个合约其实就是发送一个交易。

remix_deploy.png

一、代码

 //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

四、函数标识

solidity_func1.png

红色store调用会产生gas,表示有修改合约状态,

只有更改合约状态的时候才支付gas(transaction cost,不是execution cost),发生交易。

view

只会读取这个合约的状态(比如favNumber)。

view函数不允许修改任何状态,不会产生gas

当 retrieve()被store调用时,那他就需要支付retrieve() 的execution cost gas

pure

连合约状态都没读取,只做简单的内存运算

pure函数也不允许修改任何状态。

不允许读取区块链 数据(所以不能)。

总结

调用view函数是免费的,除非你在消耗gas的函数中调用它。

五、变量的数据位置

函数入参、局部变量 需要指定变量的数据位置(memory,calldata),如

solidity_var1.png
solidity_var2.png

memory和calldata意味着这个变量只是暂时存在,只在调用此addPerson()函数的交易期间暂时存在。

storage 存储变量甚至存在于正在执行的函数之外。

memory

可以被修改的临时变量,string,数组,结构,映射才需要加memory。

uint 不用加meory,默认就是。


solidity_var4.png
solidity_var5.png

calldata

类似memory,但是不可以修改的临时变量

solidity_var3.png

storage

如 全局变量uint256 public favNumber=0; 隐式的定义为storage。

六、部署

部署到NetaMask钱包正在连接的测试网络

solidity_dep1.png
solidity_dep2.png

确保先用测试水龙头领取一些代笔,部署需要支付gas。

点击部署,此时MetaMask插件会有提示,点击打开

solidity_dep3.png

点击确认

solidity_dep4.png

点击 view on etherscan

solidity_dep5.png

可以看到,合约已经通过 account1账号部署到测试链上。

from就是account1地址。

to就是 刚刚创建的合约地址,可以点击打开。

可以看到gas limit 和gas usage比单纯发送以太币(23000gas)高得多。

solidity_dep6.png
solidity_dep7.png

可以看到该合约下面的第一个交易:创建合约。

可以在Remix上点击按钮,在测试网络上做一遍测试。

点击retrieve这种view函数不需要gas,所以浏览器MetaMask插件不会弹出。

点击store这种会修改区块链的函数需要gas,所以浏览器MetaMask插件会弹出来确认(在etherscan上能看到store这个交易)。

solidity_dep8.png
solidity_dep9.png
solidity_dep10.png

测试链的部署可能需要等待挺久时间,所以一开始先在本地

的RemixVM(Shanghai)上调试,然后再部署到测试链Injected Provider。

添加两个用户addPerson ,需要MetaMask弹窗两次确认才可以执行。结果如下:


solidity_dep12.png
solidity_dep11.png

七、切换测试网络

MetaMask里切换就行,Remix会自动感应。

八、按钮颜色类型

蓝色:view方法,不会修改链内容,免费。

橙色:有修改链内容,支付gas。

红色:有转账行为 payable,方法内会用到 msg.value。

例如 FundMe 的fund() 函数。

如果只是接收币,还是橙色如 withDraw

九、继承、重写

  1. 用is 表示继承,重写时 父类 virtual ,子类 override。
  2. 支持多继承。
 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;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容