Solidity语法基础学习

四、函数类型:

函数

Function

function FnName [V] [SM] [return (……)] {}

·[V]:Visibility,可见性;

·[SM]:State Mutability,状态可变性;

·[returns (types……)]:回传值

  ·若无回传值可以省略;

  ·可回传一个或多个回传值。

  ·returns ( int , string memory )

代码示例:

可见性 visibility

public,private,internal,external

·public → 任何合约或者账户都可以呼叫

·private → 只有目前合约可以呼叫

·external → 除了目前合约与其继承合约外可以呼叫

·internal → 只有目前合约与其继承合约可以呼叫

状态可变性 State Mutability

pure,view

·pure → 该函数不会“读取”或“写入”任何状态

·view → 该函数只“读取”状态,比如:

  ·读取storage变量

  ·读取任何合约的余额

  ·读取以下全域变量的任何成员函数block,tx,msg(除了msg.sig与msg.data外)

  ·呼叫任何不被标记为pure的函数

  ·直接使用特定的组合语言指令

状态可变性 State Mutability

pure,view

·以下行为视为写入状态:

  ·写入资料到storage变量

  ·发出事件(emit log)

  ·建立其他合约

  ·呼叫特殊指令 selfdestruct

  ·通过call来发送Ether

  ·呼叫任何不被标记为pure或view的函数

  ·使用low-level calls

  ·使用特定组合语言指令

构造函数 Constructor

Constructor () {}

·构造函数是可选用的,若合约没有特别定义,则等价于:constructor(){}

·无回传值

·可以有传入参数,定义和普通函数相同

·构建函数只会在合约部署的那一刻被呼叫

  ·用来改变“变数的预设值”

  ·所有storage变量在呼叫constructor之前已经被初始化

·当构造函数被执行之后

  ·合约的最终程式码会被部署到区块链上

    ·可以理解成“部署”的回传值为“合约的最终程式码”

    ·最终程式码的长度也会影响燃料使用量,越走越贵

·最终程式码不包含构建函数,与仅构建函数所使用之“内部函数(Internal Functions)”

代码示例:

·本题在运行时有两种合约选择,第一个是合约A,第二个为合约B。

·合约A是没有构建函数的赋值合约

·合约B是有构建函数的整数赋值合约,不同于A合约,B合约能够在运行后再输入数值和字符串。

接收 Ether

receive() external payable{……}

·一个合约内只能有“唯一一个receive函数”

·这个特殊函数有特定形态:

  ·不需要‘function’这个关键字

  ·不允许回传任何回传值

  ·必须有‘external’与‘payable’

·receive函数会在发送一个“无calldata的交易”到合约中被触发。

特殊限制

· 当发送者使用‘send’或‘transfer’直接发送Ether过来时,receive函数可能只允许使用“2300”燃料(Gas)。

·如果在receive函数中多了以下行为,将可能消耗更多的燃料,将导致交易失败:

  ·写入存储空间(storage)

  ·建立新合约

  ·呼叫一个会消耗大量燃料的外部函数(External Function)

  ·发送Ether(因为至少会消耗另外2300燃料)

例子:

  ·建立一个合约PiggyBank

  ·部署时就能收Ether

  ·部署后也能够接收Ether

位址型态的成员函数 Member function of AddressType non-payable系列成员

·balance → uint256:回传该地址的余额(单位为wei)

·code → bytes memory:回传该地址的代码(可能为空)

·codehash → bytes32:回传该位址代码的杂凑值

·low-level call 系列:

  ·call

  ·delegatecall

  ·staticcall

payable 系列成员

·addr.transfer(uint256 amount)

  ·转amount WEI 从当前账户到addr

  ·只允许使用2300燃料

  ·失败时会触发revert → 整笔交易都取消,回到交易前

·addr.send(uint256 amount)→bool

  ·转amount WEI 从当前账户到addr

  ·只允许使用2300燃料

  ·失败时回传false

  ·建议使用‘send’

全域变量 Global Variables

msg.sender

·msg.sender → address

  ·取得当前call的发送者

当前合约 this

this

·this代指当前的合约

·address(this)可以建立一个address指向当前的合约

  ·便可以使用address拥有的成员函数

  ·如:address(this).balance()便能取得目前合约的余额

代码示例:

可以改变函数的行为

modifier MF(……){……}

·关键字:modifier

  ·宣告一个修饰函数,跟宣告函数很像

·允许有输入参数,写在()内

  ·modifier M(int X){/*对x做事情*/}

·{}就是跟函数本身一样,为各种东西

·_;

  ·这个是特殊的表示法,代表原本函数的本身

Modifier代码示例:

  modifier M(){

    //做一些事情

    _;

    //可以继续做一些事情

  }

  function F() public M{……}

错误处理函数 Error Handler Function

require(条件,“错误原因”);

·当条件为true时,不会发生事情

·反之,会触发revert(“错误原因”,将交易驳回报错原因)

代码示例:

区块链特辑——solidity语言基础(二)的更多相关文章

  1. 区块链特辑——solidity语言基础(六)

    Solidity语法基础学习 十.实战项目(二): 1.实战准备: ERC20代币接口 ERC20 Token Interface接口 Interface IName {--} ·关键字:interf ...

  2. 区块链特辑——solidity语言基础(七)

    Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...

  3. 区块链特辑——solidity语言基础(三)

    Solidity语法基础学习 五.映射类型: 映射型态 Mapping Type 映射钥匙Key → 真实资料 Value mapping(KeyType → ValueType) VariableN ...

  4. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  5. 区块链中的密码学(二)-RSA算法分析和实现

    密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...

  6. C语言基础二(敲打键盘、寻找资料)

    看过很多资料的人,估计发觉了什么,我上篇的基础一其中一个最致命的错误,没有加return 0; 为什么不加,说真的,我留个坑,所以跳跃性的直接说到函数是如何运用的. 上章说到main就是主入口,根据m ...

  7. Java语言基础二

      1.常量的概述和使用 A:什么是常量 B:Java中常量的分类 常量分类为六种:a.”字符串” b.’字符’ c.整数 d.小数 e.boolern(布尔类型) 返回值为 FALSE和TRUE   ...

  8. 区块链V1版本实现之二

    部分程序代码(生成并调用hash代码): 1 //创建区块,对Block的每一个字段填充数据 2 func NewBlock(data string, prevBlockHash []byte) *B ...

  9. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  10. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

随机推荐

  1. Netty-快速入门

    ---------------------------------------------------- netty是什么? Netty is an asynchronous event-driven ...

  2. uni-app之条件编译

    ifdef 仅出现在XXx平台上 仅出现在 App 平台下的代码 #ifdef APP-PLUS 需条件编译的代码 #endif <!-- 只在H5上有哈 --> <!-- #ifd ...

  3. 使用Hyper-V或者VM虚拟机安装部署Ubantu

    下载Ubantu iso文件 Server版下载 桌面版下载 我使用的是22.04.3版本,目前22.04最新版是22.04.5版本 22.04下载 一.Hyper-V方式 1.安装Hyper-V 参 ...

  4. 玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!

    本文分享自天翼云开发者社区<玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!>,作者:天翼云社区官方账号 Super Idol的笑容虽然非常甜 无数粉丝宝宝的心里却 ...

  5. 更快更省更好用!天翼云云原生一体机iStack打通物云最后一公里!

    近年来,随着企业数字化转型的深入,从传统 IT 架构向云原生架构转型,已经成为企业谋求更高质量发展的必由之路.然而,云原生技术复杂度高,运维成本高,且技术工具间的集成度不足.打破云原生技术应用门槛,以 ...

  6. 安全可信 | 天翼云自研密钥管理系统(KMS)获得《商用密码产品认证证书》!

    近日,天翼云自研密钥管理系统(KMS)通过国家密码管理局安全性审查,符合GM/T 0051<密码设备管理 对称密钥管理技术规范>要求,获得由国家密码管理局商用密码检测中心颁发的<商用 ...

  7. CSP 2024 游记

    初赛 Day -1 唐,rp--了. 上午语文正卷满分,然后作文挂完了靠.我没想到我作文能挂到 40pts. 吃饭的时候 gcy 说了什么奇怪的东西,然后喷饭爆金币了,社死现场.吃饭的时候还 tm 咬 ...

  8. 还堵在高速路上吗?带你进入Scratch世界带你飞

    国庆假期高速路的风景 国庆假期正式启动人从众模式,无论是高速公路还是景区,不管是去程还是回程,每一次都堪称经典. 一些网友在经历漫长的拥堵后 哭笑不得地表示 "假期都在堵车中度过了" ...

  9. hibernate的锁机制

    概述 hibernate 可以通过加锁解决并发问题. hibernate 的锁分为两种:乐观锁和悲观锁. 乐观锁(Optimistic lock):每次访问数据时,都会乐观的认为其它事务此时肯定不会同 ...

  10. kubesphere应用系列(二)部署有状态服务redis

    前言 在 Kubernetes 中,服务(Service)可以被分为有状态服务和无状态服务,个人认为的区别: 无状态服务是指不依赖于任何持久化状态的服务.它们通常是将请求处理为独立.无关的事务,并且在 ...