华企号 后端开发 Solidity入门

Solidity入门

函数基础

1.Solidity本身也是一门函数编程语言,也就是说函数可以做参数、变量、返回值。函数属于值类型,支持多返回值。

2.调用方式

  • 内部调用
  1. 内部调用采用EVM跳转调用,所以能够直接使用上下文中的数据,因为不用拷贝数据,所以在数据传递的时候非常高效
  2. 对合约内的函数,引入的库函数和从父合约中继承的函数都可以进行内部调用
  • 外部调用
  1. 采用外部交易调用,使用external。对于一个外部调用,所有的函数参数必须要拷贝到内存中。

undefined

函数定义类型

1. View:只读,不改变合约内部状态

  • 会改变合约状态的操作
  1. 写入状态变量
  2. 底层的调用
  3. 调用任何一个没有被标记为view或者pure的函数
  4. 发送以太币
  5. 使用自毁函数
  6. 创建合约
  7. 触发事件

undefined

在箭头位置添加view,可以解除方框内的warning。

2. Pure:也不会修改合约状态,而且pure标记的函数不能读取合约状态(可以读取与合约状态无关的数据)。

  • 与view相比,pure的限制还包括更多的内容
  1. 不能读取状态变量
  2. 用任何一个没有被标记为pure的函数
  3. 不能访问block,tx,msg的大多数成员(可以访问msg.sig,msg.data)
  4. 不能访问this.balance或者address.balance

undefined

特殊函数类型

回退函数

  • 定义:在每个合约中都有一个没名字的函数,该函数没有名字、没参数、没有返回值,这就是回退函数
  • 作用:
  1. 在调用合约时,没有匹配上任何一个函数
  2. 如果回调函数要接收ether,必须要有payable修改饰符
  3. 给合约发送ether时也会调用,需要注意的是,如果合约没有定义回调函数的话,接收ether会触发异常。

undefined

调用一个存在的函数,若没有调到,则调用回退函数。

自毁函数

  • 自毁函数可以摧毁当前合约,如果合约中有以太币,则会将以太币转移到给定的地址
  • 如果合约在被自毁之后还有人发送以太币到这个合约地址,那么这些以太币就会消失,无法赎回

Solidity入门插图4

Solidity入门插图5

常函数

  • 关键字 : constant
  • 常函数不会修改区块链上的任何状态,没有强制的规定,但是会给警告。

图片

访问器(getter)

  • 编译器为自动为所有的public状态变量创建访问器
  • 访问函数具有外部可见性。如果通过内部方式访问,可以直接当成一个变量。但如果通过外部方式进行访问,比如通过this,那么必须通过函数的方式调用。

Solidity入门插图7

其它内置函数

加密函数

  • Solidity中的加密实际上调用的是以太中的加密函数
  • keccak256(x)

undefined

  • sha256(x)
  • sha3(x)
  • ripemd160(x)
  • ecrecover(hash, v, r, s) 公钥恢复的函数

数据函数

  • addmod(x, y, k):x+y对k取余
  • mulmod(x, y, k):x * y 对k 取余

undefined

函数修改器(modifier)

  • 修改器的作用是在函数执行前检查某种前置条件是否满足
  • 修改器是一种合约的属性,可以被继承也可以被派生的合约重写。
  • 一个函数可以有多个修改器,其间采用空格分开,而修改器的生效顺序与定义顺序一样。
  • 必须要加  _;

Solidity入门插图10

函数可见性与权限

内部函数:internal

外部函数:external

私有函数:private

公有函数:public

  • Internal:不能够在当前合约的上下文环境之外执行,只能在当前合约内进行调用。比如当前的代码块,内部的库函数,继承的合约中。
  • external:
  1. external可以用途外部函数调用的参数,或者由外部函数调用返回
  2. 还可以通过其它合约进行调用
  3. 如果是this调用,那么都是在通过external的方式进行调用
  4. 不能在内部去调用一个外部函数
  • private:私有函数只能在当前合约中进行访问,不能通过继承进行访问
  • public:公有函数,可以通过内部,外部,或者消息进行进行调用。对于public类型的状态变量,会自动创建一个访问器。

在内部调用:

undefined

在外部调用:

 

undefined

 

通过继承调用:

 

undefined

 

版权声明:本文为CSDN博主「super_lixiang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部