Solidity进阶

2022.2.21

主要内容

Solidity语法

Solidity源文件布局

Solidity值类型

Solidity引用类型

Solidity地址类型

字符数组(Byte Arrays)

定长字符数组

节序列

变长字符数组

枚举(Enum)

数组(Array)

结构(Struct)

映射(Mapping)

应该返回300,10,0.因为c.update传入的参数,是调用他的地址,address(c)是c的地址,在合约C创建的时候,c的balances就是300;address(this)的this是D,fun()中的c.update传入了D的地址,所以d的balances经过updated成了10;c.balances(msg.sender)获取的是用户的地址对应的balances,并没有设置过,是0。

运行结果贴图:

address

Solidity数据位置

数据位置总结

案例程序

数组案例

运行截图:

(appendOne和appendTwo已经输入了多个数,截图展示的是最后一个;data1和data2是输入下标点击显示对应内容)

数组

程序改错1

magic

这是因为uint[] x;定义的时候没有初始化,形成了野指针,指针默认指向程序开头。长度可变的数组在存储过程中,会存储这个数组的长度。所以会产生错误。

程序改错2

猜数字游戏

Guess newGuess;错误在这里!还是指针没赋初始值

Solidity函数声明和类型

函数的值类型有两类: 内部(internal)函数外部(external)函数

Solidity函数可见性

 

Solidity函数状态可变性

函数修饰器(modifier)

回退函数(fallback)

事件(event)

• 事件是以太坊EVM提供的一种日志基础设施。事件可以用来做操作记录,存储为日志。也可以用来实现一些交互功能,比如通知UI,返回函数调用结果等

• 当定义的事件触发时,我们可以将事件存储到EVM的交易日志中,日志是区块链中的一种特殊数据结构;日志与合约关联,与合约的存储合并存入区块链中;只要某个区块可以访问,其相关的日志就可以访 问;但在合约中,我们不能直接访问日志和事件数据

• 可以通过日志实现简单支付验证SPV(SimplifiedPayment Verification),如果一个外部实体提供了一个带有这种证明的合约,它可以检查日志是否真实存在于区块链中

Solidity异常处理

Solidity中的单位