区块链特辑——solidity语言基础(二)
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语言基础(二)的更多相关文章
- 区块链特辑——solidity语言基础(六)
Solidity语法基础学习 十.实战项目(二): 1.实战准备: ERC20代币接口 ERC20 Token Interface接口 Interface IName {--} ·关键字:interf ...
- 区块链特辑——solidity语言基础(七)
Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...
- 区块链特辑——solidity语言基础(三)
Solidity语法基础学习 五.映射类型: 映射型态 Mapping Type 映射钥匙Key → 真实资料 Value mapping(KeyType → ValueType) VariableN ...
- 比原链CTO James | Go语言成为区块链主流开发语言的四点理由
11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...
- 区块链中的密码学(二)-RSA算法分析和实现
密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...
- C语言基础二(敲打键盘、寻找资料)
看过很多资料的人,估计发觉了什么,我上篇的基础一其中一个最致命的错误,没有加return 0; 为什么不加,说真的,我留个坑,所以跳跃性的直接说到函数是如何运用的. 上章说到main就是主入口,根据m ...
- Java语言基础二
1.常量的概述和使用 A:什么是常量 B:Java中常量的分类 常量分类为六种:a.”字符串” b.’字符’ c.整数 d.小数 e.boolern(布尔类型) 返回值为 FALSE和TRUE ...
- 区块链V1版本实现之二
部分程序代码(生成并调用hash代码): 1 //创建区块,对Block的每一个字段填充数据 2 func NewBlock(data string, prevBlockHash []byte) *B ...
- C语言基础--二维数组
二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...
- Solidity语言基础 和 Etherum ERC20合约基础
1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的, 小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...
随机推荐
- JMeter JDBC 请求实战宝典
<JMeter JDBC 请求实战宝典> 宝子们,今天咱就来唠唠 JMeter 里超厉害的 JDBC 请求,这玩意儿就像是数据库世界的神奇魔杖,能帮咱把数据库里的各种秘密(数据)都挖出来, ...
- Java生成Word文档之 XDocReport 和 Poi-tl
近期参与的多个项目中,均涉及根据预定义模板生成Word文档以供前端下载的需求.以往,我们通常采用将Word文档转换为XML格式,并通过代码赋值变量的方式来实现这一功能.尽管此方法在技术层面可行,但当面 ...
- java加密算法入门(四)-加密算法汇总
如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...
- 【Docker】---部署集群(2)
RocketMQ(2)-Docker集群部署RocketMQ =前言= 1.因为自己只买了一台阿里云服务器,所以RocketMQ集群都部署在单台服务器上只是端口不同,如果实际开发,可以分别部署在多台服 ...
- postman环境设置以及参数传递
通常一个公司项目有不同的环境(开发环境,测试环境,上线环境),在做测试时候,有可能会遇到接口改变之类的,postman保存了很多接口,想要再测试局需要多次修改域名或者端口,这个时候就需要配置环境 1. ...
- Hetemit pg walkthrough Intermediate
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.117 Starting Nmap 7.94SVN ( https://nmap.org ) a ...
- 一键实现风险识别+处理,天翼云AOne助手尽在“掌”握!
随着企业数字化建设的不断加速,优化站点性能与响应速度成为当今时代的一个重要课题.对于政务.金融类机构来说,其门户网站.信用卡中心等代表着对外形象,如果出现访问不通或者时延严重的现象将影响业务办理效率以 ...
- galaxy特色胡思乱想
有没有什么办法,让我不伤害任何人,什么也不破坏,被判死刑.我觉得这样比我紫砂要好的多. 我所可怜的是神不能紫砂.--芥川龙之介<某傻子的一生>
- Kyuubi支持Iceberg配置
一.简述 Kyuubi调用Spark来查询iceberg表,修改Spark配置信息即可. 二.服务配置 1.上传jar包到Kyuubi server节点 可以选择emr spark组件后,按照配置组( ...
- ATT&CK实战系列(一)
环境下载 下载靶场环境,并导入虚拟机分别是win2003.win7.winserver2008 配置网络 虚拟机--编辑--虚拟机网络编辑器--添加网络VMnet2--仅主机模式分配的地址是192.1 ...