首页 > 其他分享 >区块链特辑——solidity语言基础(二)

区块链特辑——solidity语言基础(二)

时间:2023-01-10 23:12:29浏览次数:44  
标签:函数 示例 solidity Ether 回传 特辑 区块 合约 呼叫

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,Ether,回传,特辑,区块,合约,呼叫
From: https://www.cnblogs.com/wybsignal/p/17041647.html

相关文章

  • 区块链特辑——solidity语言基础(三)
    Solidity语法基础学习五、映射类型:映射型态MappingType映射钥匙Key→真实资料Valuemapping(KeyType→ValueType)VariableName·关键字:mapping·宣告一......
  • solidity 内存(memory) 可变数组的增删改查 操作
    //SPDX-License-Identifier:MITpragmasolidity^0.8.9;libraryArray{functionpush(uint256[]memory_nums,uint256_num)internalpure{assemb......
  • 区块链入门 ③ - 交易
    区块链入门③-交易交易概述比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个......
  • 区块链的技术基础
    区块链的技术基础拜占庭将军问题:​​https://www.8btc.com/article/70370​​区块链的类型:公有区块链、联盟链(又名许可链)、侧链分布式算法在经济学上的扩展加密签名算法......
  • 产业区块链一周快讯速览(六)
    政策公告成都印发首个“元宇宙”政策文件,提出到2025年元宇宙相关产业规模达到1500亿元成都市新经济发展工作领导小组办公室近日印发《成都市元宇宙产业发展行动方案(2022......
  • Web3区块链DAS域名注册教程 tron trx链波卡钱包地址解析 用户名转账 ENS
    而在去中心化系统中,大部分人充值、转账时,使用的都是区块链原生的长地址,比如:ETH的地址:0x9euo8sHip*******dHld90CKB的地址:ckHUEI829D********hfjdD0在操作过程中,这......
  • HTML学习之表格,列表,区块,布局
    HTML表格表格由<table>标签来定义。每个表格均有若干行(由<tr>标签定义),每行被分割为若干单元格(由<td>标签定义)。字母td指表格数据(tabledata),即数据单元格的内容。数......
  • AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计
    AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、......
  • 麻将与区块链
    转网上的段子:【其实,世界上最早的区块链项目,起源于中国麻将】甲首先发起一个申请,我要打麻将,组建一个麻将局,这就相当于创建一个区块,这个区块就会被广播给乙、丙、丁、A、B、C......
  • 处理区块链中大数的转化,显示整数部分使用千分位,保留精度
    在我们写区块链中常遇到后端返回的非常大的数字,需要前端处理显示,一开始我们使用数字直接除以18个0,会发现在整除的时候会莫名的出现一堆长的数字丢失了相应的精度。是因为浮......