首页 > 其他分享 >Solidity 函数及修改器(modifier)的用法

Solidity 函数及修改器(modifier)的用法

时间:2022-11-30 11:01:59浏览次数:43  
标签:function return uint256 Solidity returns 修改器 uint modifier public

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Function {
// 多返回值函数
function returnMany()
public
pure
returns (
uint,
bool,
uint
)
{
return (1, true, 2);
}

// 可以命名返回值
// 0: uint256: x 1
// 1: bool: b true
// 2: uint256: y 2
function named()
public
pure
returns (
uint x,
bool b,
uint y
)
{
return (1, true, 2);
}

// 返回值可以指定给其名称
// 在这种情况下,可以省略return语句。
function assigned()
public
pure
returns (
uint x,
bool b,
uint y
)
{
x = 1;
b = true;
y = 2;
}

// 调用另一个函数时使用解构方式赋值
// 返回多个值的函数。
function destructuringAssignments()
public
pure
returns (
uint,
bool,
uint,
uint,
uint
)
{
(uint i, bool b, uint j) = returnMany();

// 值可以省略。5,就被忽略了
(uint x, , uint y) = (4, 5, 6);

return (i, b, j, x, y);
}

//不能将映射用于输入或输出 例如:function mappingInput(mapping m) public {}
// 可以使用数组进行输入
function arrayInput(uint[] memory _arr) public {}
}

Solidity 函数及修改器(modifier)的用法_ide

函数的调用

// 函数的调用
contract XYZ {
function plus(uint256 x, uint256 y) public pure returns (uint256) {
return x + y;
}

//按顺序调用参数
function callFunc() external pure returns (uint256) {
return plus(1, 2);
}

//指明 key 值传递入参
function callFuncWithKeyValue() external pure returns (uint256) {
return plus({x: 1, y: 2});
}
}

Solidity 函数修改器 modifier

modifier 类似于代码块,它会嵌入到代码执行逻辑中,应用于重复逻辑判断的抽离

我们先正常写个加减法函数看下返回值

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract ModifierTest {
function plus(uint256 _x, uint256 _y) public pure returns (uint256) {
require(_x > _y, "x>y");
return 1 + 1;
}

function sub(uint256 _x, uint256 _y) public pure returns (uint256) {
require(_x > _y, "x>y");
return 2 - 1;
}
}

Solidity 函数及修改器(modifier)的用法_ethereum_02

我们发现两个方法都用到了相同的逻辑判断 ​​require(_x > _y, "x>y");​​ 我们可以通过 modifier 抽离出来。

然后我们写一个modifier:

其中​​_;​​ 这个符号表示代码继续执行函数后面的逻辑;

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Owner {
modifier compare(uint256 _x, uint256 _y) {
require(_x > _y, "x>y");
_;
}

function plus(uint256 _x, uint256 _y)
public
pure
compare(_x, _y)
returns (uint256)
{
return _x + _y;
}

function sub(uint256 _x, uint256 _y)
public
pure
compare(_x, _y)
returns (uint256)
{
return _x - _y;
}
}

​_;​​这个符号后面也可以继续写逻辑,后续逻辑会在函数调用后被执行;我们来看一下

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Owner {
address public owner;
modifier compare(uint256 _x, uint256 _y) {
require(_x > _y, "x>y");
_;
require(owner == msg.sender,"not owner");
}

function plus(uint256 _x, uint256 _y)
public
compare(_x, _y)
returns (uint256)
{
// 把 owner 设为调用者
owner = msg.sender;
return _x + _y;
}
// 因为用到了状态变量所以要把 pure 改为 view
function sub(uint256 _x, uint256 _y)
public
view
compare(_x, _y)
returns (uint256)
{
return _x - _y;
}
}

我们先来测一下 ​​sub​​ 方法,输入 ​​1,2​

Solidity 函数及修改器(modifier)的用法_ide_03

可以看到错误提示 ​​x>y​

输入 ​​2,1​​ 看到错误 ​​not owner​

Solidity 函数及修改器(modifier)的用法_区块链_04

因为我们的 owner 默认值为 0 所以才会报错.

Solidity 函数及修改器(modifier)的用法_Solidity_05

我们再来点一下 ​​plus​​: 输入 ​​2,1​​,合约调用成功, 我们把 owner 地址赋值为调用者 ​​msg.sender​​ 了

Solidity 函数及修改器(modifier)的用法_区块链_06

我们再来点击一下 sub 方法试试看看还报不报错.

Solidity 函数及修改器(modifier)的用法_Solidity_07

可以看到,已经可以正常返回了, 因为 owner 被赋值为了调用者.

Solidity 函数及修改器(modifier)的用法_区块链_08

如果我们切换了账号以后,再点 ​​plus​​方法就会又报错 ​​not owner​​了

标签:function,return,uint256,Solidity,returns,修改器,uint,modifier,public
From: https://blog.51cto.com/u_1540468/5897852

相关文章

  • Solidity基础介绍
    solidty跟javascript有一定的相似认识一个最简单的存储合约让我们先看一下最基本的例子。现在就算你都不理解也不要紧,后面我们会有更深入的讲解。//SPDX-License-Identifi......
  • Solidity智能合约结构介绍
    变量局部变量在函数内部声明不存储到链上状态变量在函数外部声明状态变量是永久地存储在链上的值。全局变量提供有关区块链的信息//SPDX-License-Identifier:MITpragmas......
  • Solidity中view和pure的用法
    getter类型的函数可以被view或者pure修饰。view修饰的函数不能改变状态变量。pure则既不能改变状态变量,也不取读取状态变量。//SPDX-License-Identifier:MITpragma......
  • 在 Solidity 中 ++i 为什么比 i++ 更省 Gas?
    前言作为一个初学者,“在Solidity中++i为什么比i++更省Gas?”这个问题始终在每个寂静的深夜困扰着我。也曾在网上搜索过相关问题,但没有得到根本性的解答。最终决定......
  • 智能合约开发-hardhat、solidity和react的全栈开发
    创建react工程先通过npx创建react工程,工程名称full-stack-dappnpxcreate-react-appfull-stack-dapp 然后进入full-stack-dapp目录npmrunstart......
  • VBA编辑器美化 VBA颜色修改器 VBE黑色背景如何设置 VBE修改背景颜色
    VBA代码助手下载地址VBE颜色修改器VBA颜色修改器软件使用详解注意请关闭Office更新否则一更新就会变为灰色背景要重新设置office自动更新后无法修改背景色请重新安......
  • Solidity基础 | 03 一篇文章掌握值类型(布尔型和整型)及其运算
    导读区块链这么火,不学一下怎么行?今天这篇文章将带领大家了解区块链的两种基本值类型——布尔类型和整数类型!讲解类型涉及到的运算以及一些注意问题。让我们一起走进本文看一......
  • Solidity基础 | 02 基本合约结构
    导读区块链这么火,不学一下怎么行?今天这篇文章将带领大家了解合约的结构,了解最基本合约,为以后设计功能更加强大的合约打下基础!让我们一起走进本文看一下吧!如果你有什么问题,或......
  • solidity数组的使用
    长度固定的数组uint[]定义的数组,可以使用引用查看索引位置的数值,使用.length得到数组的长度byte定义的数组,将字符串以十六进制形式保存,不能使用.length。byte默认值为0......
  • solidity数据存储位置以及存储报错
    solidity数据存储位置solidity文档在0.5.0之后发生大变动,复杂的数据类型必须给出明确的数据存储位置:memory、storage和calldate三个存储位置的区别storage存储永......