目录

  • 1 区块链行业与职业
    • 1.1 区块链行业
      • 1.1.1 2020全球区块链产业应用与人才培养报告
      • 1.1.2 区块链行业人才需求解读(高职版)
      • 1.1.3 区块链应用操作员国家职业技术技能标准
      • 1.1.4 区块链职业技能标准及1+X 证书
      • 1.1.5 20220830 区块链2班授课视频1
      • 1.1.6 20220830 区块链2班腾讯会议
      • 1.1.7 20220830 区块链1班腾讯会议视频
    • 1.2 区块链应用软件开发与运维职业技能等级
      • 1.2.1 职业技能等级标准
      • 1.2.2 腾讯教材(初级)
      • 1.2.3 腾讯教材(中级)
      • 1.2.4 腾讯教材(高级)
      • 1.2.5 20220906 区块链1班腾讯会议视频
    • 1.3 区块链专业简介
      • 1.3.1 高职专科
      • 1.3.2 高职本科
  • 2 区块链基础
    • 2.1 区块链概述
      • 2.1.1 区块链实用型技能树
      • 2.1.2 什么是区块链
      • 2.1.3 区块链起源和发展
      • 2.1.4 分布式系统概论
      • 2.1.5 20220906 区块链1班腾讯会议视频
    • 2.2 remix 开发环境搭建
    • 2.3 访问智谷星图的remix环境
    • 2.4 FISCO BCOS入门
      • 2.4.1 FISCO BCOS环境搭建
      • 2.4.2 WeBase环境搭建
      • 2.4.3 Webase智能合约管理
    • 2.5 毕业啦项目介绍
    • 2.6 智能合约初探
    • 2.7 深入浅出solidity
  • 3 区块链咨询
    • 3.1 区块链组成原理
      • 3.1.1 20220906 区块链2班手机录像
      • 3.1.2 20220906 区块链2班腾讯会议视频
    • 3.2 智能合约
      • 3.2.1 20220906 区块链2班腾讯会议视频
      • 3.2.2 20220906 区块链2班手机录像
    • 3.3 区块链电子发票
      • 3.3.1 20220907 区块链1班腾讯视频
      • 3.3.2 20220907 区块链2班腾讯会议视频
    • 3.4 区块链跨境支付
      • 3.4.1 20220907 区块链1班腾讯视频
      • 3.4.2 20220907 区块链2班腾讯会议视频
      • 3.4.3 20220912 区块链2班腾讯会议视频
    • 3.5 区块链供应链金融
      • 3.5.1 20220907 区块链1班腾讯视频
    • 3.6 区块链国际贸易
      • 3.6.1 20220907 区块链1班腾讯视频
  • 4 solidity基础
    • 4.1 第一个solidity程序
      • 4.1.1 20220912 21级2班腾讯会议视频
      • 4.1.2 20220912 21级2班手机视频
      • 4.1.3 20220914 21级1班手机录像
      • 4.1.4 20220914 21级1班腾讯会议视频
    • 4.2 数据类型
      • 4.2.1 20220912 21级2班腾讯会议视频
      • 4.2.2 20220912 21级2班手机视频
      • 4.2.3 20220914 21级1班腾讯会议视频
    • 4.3 变量和运算符
      • 4.3.1 20220920 21级2班腾讯会议视频
      • 4.3.2 20220920 21级2班腾讯会议视频
      • 4.3.3 20220920 21级1班腾讯会议视频
      • 4.3.4 20220920 21级1班手机录像
      • 4.3.5 20220920 21级1班手机录像
    • 4.4 循环语句
    • 4.5 条件语句
    • 4.6 数据存储类型
      • 4.6.1 20220920 21级2班腾讯会议视频
      • 4.6.2 20220920 21级1班腾讯会议
      • 4.6.3 20220920 21级1班手机录像
    • 4.7 结构体
      • 4.7.1 20220920 21级1班腾讯会视频
      • 4.7.2 20220920 21级1班手机录像
      • 4.7.3 20220921 21级2班手机录像
      • 4.7.4 20220921 21级2班腾讯会议视频
    • 4.8 数组
      • 4.8.1 20220921 21级1班手机录像
      • 4.8.2 20220921 21级1班腾讯会议视频
      • 4.8.3 20220927 21级2班腾讯会议视频
      • 4.8.4 20220927 21级2班手机录像
    • 4.9 枚举
    • 4.10 20220921 21级1班手机录像
    • 4.11 20220921 21级1班腾讯会议视频
    • 4.12 映射
    • 4.13 Solidity中的单位
    • 4.14 20220927 21级2班腾讯会议视频
    • 4.15 20220927 21级2班手机录像
    • 4.16 20220927 21级1班腾讯会议视频
    • 4.17 20220927 21级1班手机录像
    • 4.18 函数
      • 4.18.1 20220927 21级1班腾讯会议视频
      • 4.18.2 20220927 21级1班手机录像
    • 4.19 函数修饰符
    • 4.20 变量作用域和函数可见性
    • 4.21 状态可变性
  • 5 solidity进阶
    • 5.1 构造函数
    • 5.2 函数重载
    • 5.3 抽象合约
    • 5.4 库
    • 5.5 接口
    • 5.6 加密函数和数学函数
    • 5.7 合约继承
    • 5.8 错误处理
    • 5.9 事件
      • 5.9.1 2022.11.02 区块链1班腾讯会议视频
    • 5.10 类型转换
      • 5.10.1 2022.11.02 区块链1班腾讯会议视频
      • 5.10.2 2022.11.02 区块链2班腾讯会议视频
    • 5.11 回退函数
      • 5.11.1 2022.11.08 区块链2班腾讯会议视频
    • 5.12 转账方式
      • 5.12.1 2022.11.08 区块链2班腾讯会议视频
      • 5.12.2 2022.11.08 区块链1班 腾讯会议视频
    • 5.13 实践代码
  • 6 智能合约游戏案例初阶
    • 6.1 合约
    • 6.2 整形和状态变量
    • 6.3 算数运算符
    • 6.4 结构体和字符串
    • 6.5 数组
    • 6.6 函数1
    • 6.7 函数2
    • 6.8 函数3
    • 6.9 类型转换
    • 6.10 事件
    • 6.11 地址类型、映射
    • 6.12 全局变量
    • 6.13 异常处理
    • 6.14 引入与继承
    • 6.15 数据位置
    • 6.16 函数可见性1
    • 6.17 函数可见性2
    • 6.18 接口1
    • 6.19 接口2
    • 6.20 接口3
    • 6.21 条件语句
  • 7 智能合约游戏案例进阶
    • 7.1 智能合约的不可更改性
    • 7.2 合约的“所有权”和权限控制
    • 7.3 函数修饰符 onlyOwner
    • 7.4 时间单位
    • 7.5 区块宠物间隔周期
    • 7.6 函数修饰符-公有函数和安全性
    • 7.7 函数修饰符-带参数的函数修饰符
    • 7.8 函数修饰符-自定义函数修饰符
    • 7.9 燃料gas
    • 7.10 gas-使用view节约gas
    • 7.11 gas-存储非常昂贵
    • 7.12 gas-for循环减少写入
    • 7.13 可支付
    • 7.14 体现和转账
    • 7.15 宠物大乐斗
    • 7.16 生成随机数
    • 7.17 宠物大乐斗流程
    • 7.18 重构通用逻辑
    • 7.19 更多重构
    • 7.20 排行榜-斗舞逻辑
    • 7.21 宠物舞技排行榜
    • 7.22 宠物胜利判断
    • 7.23 宠物失败判断
  • 8 区块链企业项目
    • 8.1 项目背景
    • 8.2 企业智能合约应用
    • 8.3 功能实现上
    • 8.4 功能实现下
    • 8.5 功能实现下代码续
    • 8.6 毕业证系统的solidity代码
  • 9 solidity语法详解
    • 9.1 源文件映射
    • 9.2 特殊特性(Esoteric Features)
    • 9.3 新建目录
    • 9.4 内部机制
    • 9.5 调用数据的布局(Layout of CallData)
    • 9.6 内存变量的布局(Layout in Memory)
    • 9.7 状态变量的存储模型(Layout of State Variables in Storage)
    • 9.8 独立的汇编语言
    • 9.9 Solidity Assembly
    • 9.10 库(Libraries)
    • 9.11 接口
    • 9.12 抽象合约(Abstract Contracts)
    • 9.13 继承(Inheritance)
    • 9.14 事件(Events)
    • 9.15 回退函数(fallback function)
    • 9.16 常量(constant state variables)
    • 9.17 新建目录
    • 9.18 函数修改器(Function Modifiers)
    • 9.19 访问函数(Getter Functions)
    • 9.20 可见性或权限控制(Visibility And Accessors)
    • 9.21 合约
    • 9.22 内联汇编(Inline Assembly)
    • 9.23 异常(Excepions)
    • 9.24 作用范围和声明(Scoping And Decarations)
    • 9.25 赋值(Assignment)
    • 9.26 表达式的执行顺序(Order of Evaluation of Expressions)
    • 9.27 创建合约实例(Creating Contracts via `new`)
    • 9.28 函数调用(Function Calls)
    • 9.29 新建目录
    • 9.30 控制结构
    • 9.31 入参和出参(Input Parameters and Output Parameters)
    • 9.32 地址相关(Address Related)
    • 9.33 数学和加密函数(Mathematical and Cryptographic Functions)
    • 9.34 特殊变量及函数(Special Variables and Functions)
    • 9.35 时间单位(Time Units)
    • 9.36 货币单位(Ether Units)
    • 9.37 类型推断(Type Deduction)
    • 9.38 基本类型间的转换
    • 9.39 左值的相关运算符
    • 9.40 映射/字典(mappings)
    • 9.41 结构体(struct)
    • 9.42 数组
    • 9.43 数据位置(Data location)
    • 9.44 引用类型(Reference Types)
    • 9.45 函数(Function Types)
    • 9.46 枚举
    • 9.47 六进制字面量
    • 9.48 字符串(String literal)
    • 9.49 小数
    • 9.50 字节数组(byte arrays)
    • 9.51 地址(Address)
    • 9.52 整型(Integer)
    • 9.53 布尔(Booleans)
    • 9.54 值类型与引用类型
    • 9.55 智能合约源文件的基本要素概览(Structure of a Contract)
    • 9.56 Solidity智能合约文件结构
    • 9.57 solidity中的特殊函数
    • 9.58 新建目录
    • 9.59 新建目录
  • 10 springboot vue前端后端分离项目
    • 10.1 创建springboot 动态页面 和api
    • 10.2 创建vue项目
    • 10.3 编写vue前端页面访问api
函数调用(Function Calls)

函数调用(Function Calls)

内部函数调用(Internal Function Calls)

在当前的合约中,函数可以直接调用(内部调用方式),包括也可递归调用,来看一个简单的示例:

contract C {
    function g(uint a) returns (uint ret) { return f(); }
    function f() returns (uint ret) { return g(7) + f(); }
}

这些函数调用在EVM中被翻译成简单的跳转指令。这样带来的一个好处是,当前的内存不会被回收。所以在一个内部调用时传递一个内存型引用效率将非常高。当然,仅仅是同一个合约的函数之间才可通过内部的方式进行调用。

外部函数调用(External Function Calls)

表达式this.g(8);c.g(2)(这里的c是一个合约实例)是外部调用函数的方式。实现上是通过一个消息调用,而不是直接通过EVM的指令跳转。需要注意的是,在合约的构造器中,不能使用this调用函数,因为当前合约还没有创建完成。

其它合约的函数必须通过外部的方式调用。对于一个外部调用,所有函数的参数必须要拷贝到内存中。

当调用其它合约的函数时,可以通过选项.value(),和.gas()来分别指定,要发送的ether量(以wei为单位),和gas值。

pragma solidity ^0.4.0;

contract InfoFeed {
    
    function info() payable returns (uint ret) { 
        return msg.value;
    }
}


contract Consumer {
    
    function deposit() payable returns (uint){
        return msg.value;
    } 
    
    function left() constant returns (uint){
        return this.balance;
    }
    
    function callFeed(address addr) returns (uint) { 
        return InfoFeed(addr).info.value(1).gas(8000)(); 
    }
}

上面的代码中,我们首先调用deposit()Consumer合约存入一定量的ether。然后调用callFeed()通过value(1)的方式,向InfoFeed合约的info()函数发送1ether。需要注意的是,如果不先充值,由于合约余额为0,余额不足会报错Invalid opcode1

InfoFeed.info()函数,必须使用payable关键字,否则不能通过value()选项来接收ether

代码InfoFeed(addr)进行了一个显示的类型转换,声明了我们确定知道给定的地址是InfoFeed类型。所以这里并不会执行构造器的初始化。显示的类型强制转换,需要极度小心,不要尝试调用一个你不知道类型的合约。

我们也可以使用function setFeed(InfoFeed _feed) { feed = _feed; }来直接进行赋值。.info.value(1).gas(8000)只是本地设置发送的数额和gas值,真正执行调用的是其后的括号.info.value(1).gas(8000)()

如果被调用的合约不存在,或者是不包代码的帐户,或调用的合约产生了异常,或者gas不足,均会造成函数调用发生异常。

如果被调用的合约源码并不事前知道,和它们交互会有潜在的风险。当前合约会将自己的控制权交给被调用的合约,而对方几乎可以做任何事。即使被调用的合约是继承自一个已知的父合约,但继承的子合约仅仅被要求正确实现了接口。合约的实现,可以是任意的内容,由此会有风险。另外,准备好处理调用你自己系统中的其它合约,可能在第一调用结果未返回之前就返回了调用的合约。某种程度上意味着,被调用的合约可以改变调用合约的状态变量(state variable)来标记当前的状态。如,写一个函数,只有当状态变量(state variables)的值有对应的改变时,才调用外部函数,这样你的合约就不会有可重入性漏洞。

命名参数调用和匿名函数参数(Named Calls and Anonymous Function Paramters)

函数调用的参数,可以通过指定名字的方式调用,但可以以任意的顺序,使用方式是{}包含。但参数的类型和数量要与定义一致。

pragma solidity ^0.4.0;

contract C {
    function add(uint val1, uint val2) returns (uint) { return val1 + val2; }

    function g() returns (uint){
        // named arguments
        return add({val2: 2, val1: 1});
    }
}

省略函数名称(Omitted Function Parameter Names)

没有使用的参数名可以省略(一般常见于返回值)。这些名字在栈(stack)上存在,但不可访问。

pragma solidity ^0.4.0;

contract C {
    // omitted name for parameter
    function func(uint k, uint) returns(uint) {
        return k;
    }
}

参考资料


  1. 如何使用Remix向合约发送ether参见这里。http://me.tryblockchain.org/%E6%94%AF%E4%BB%98%E7%9B%B8%E5%85%B3.html