智能合约与以太坊虚拟机:智能合约、solidity语言

第四章



一、智能合约

智能合约的行为由合约代码控制,智能合约的账户存储保存了合约的状态。
智能合约的代码运行在以太坊虚拟机中,以太坊虚拟机是以太坊协议的核心。
从存储上来看智能合约包括了商品的信息以及所有的交易记录;从功能上看,该合约包含了:补货功能、交易功能、提款功能。

1、存储方式

以太坊虚拟机的存储方式分为三类:栈、账户存储、内存。stack、storage、memory。
栈是一种常见的线性数据结构,栈中每个元素的长度是256位(bit)。
账户存储是作为账户的一个属性保存在区块链上,所以雨银盘一样都是持久化存储,并不会随着合约执行结束而释放。账户存储的键值都是256位。将一个值从0赋值为非0需要消耗20000单位Gas。修改一个非0的值需要消耗5000单位Gas。将一个值从非0赋值到0可以回收15000单位Gas。
内存是以太坊虚拟机在运行代码时临时分配的一块线性空间,会随着合约调用的结束自动释放。字节是内存的基本存储单位。每次消耗完,都需要扩展32字节为单位的区域,每32字节消耗3单位Gas。
为了节约Gas,通常在合约执行的中间过程使用内存,最终结果保存在账户存储中。

2、指令集和消息调用

消息调用包含在交易中,并不会在区块链中产生一条新的交易记录。
代理调用(delegate call):他只从目标合约获取代码并执行,并不会改变当前的上下文环境,包括msg.sender和msg.value、当前账户、存储、内存等。这使得智能合约可以在运行时动态的从其他地址加载代码。

3、日志

开发者可以在合约代码运行过程中记录各种事件产生的日志,这些日志可以帮助开发者调用代码,或者作为在区块链上发生交易的证据。
区块链并不会保存完整的日志,而是在交易回执中保存日志的散列值校验。
布隆过滤器(Bloom Filter)可以用于快速检索某一个元素是否可能在一个集合中。可以提高查找效率。

二、solidity语言

变量类型根据参数传递方式不同可以分为两类:值类型、引用类型。

  • 值类型:每次复制或者作为参数传递是都会创建一份拷贝。包括:bool、int、uint后缀必须是8~256范围内8的倍数。enums默认从0开始、address长度为20字节。address.transfer执行失败会抛出异常并终止,address.send会返回false并继续执行.
  • 引用类型:两种存储地点:账户存储和内存。状态变量与部分类型的局部变量默认存储在账户存储中,函数的参数或者其他简单类型的局部变量则保存在内存中。必要时还可以声明变量是加上memory或者storage修饰词来强制限定变量的存储地点。包括:数组,push可以在数组尾部添加元素、结构体、映射(Mapping):是一种键值对映射关系的存储结构,mapping(KeyType=>ValueType),映射没有长度的概念,也不存储键,只存储键的Keccak-256散列值。

1、类型转换

隐式转换:uint8可以转换成uint16或者uint32,但是int8不能转化成uint6,任何可以转换成uint16的变量都可以转换成address类型。

2、运算符

solidity包括算数运算符、比较运算符、位运算符。
delete表示默认值。但是对mapping无效。

3、区块和交易属性:

block.blockhash:获得特定区块的散列值
block.coinbase:当前区块“矿工”的账号地址
block.difficulty:
block.gaslimit
block.number:当前区块编号。
block.timestamp:uint,当前区块的产生时间
msg.gas:uint,表示剩余的Gas
msg.sender:address,当前消息的发送者地址
msg.sig:bytes4,调用数据的前4字节,函数标识符。
msg.value:uint,该消息转账的以太币数额.单位:wei
tx.gasprice:uint,当前交易的Gas价格
tx.origin:address,完整调用链的发起者。
selfdestruct:销毁当前合约。
suicide:selfdistruct的别名。

4、控制结构语句

不支持switch和goto。

5、函数

一个函数可以有多个参数 ,多个返回值。
函数调用分为两种:

  • 内部调用:调用同一合约中的函数
  • 外部调用:调用其他合约中的实例,会创建一个消息发送给被调用的合约,如this.a()或者foo.bar()。

external:外部函数
public:外部内部都可以
internal:只能在当前合约或者继承当前合约的其他合约中访问
private:内部

6、constant函数和fallback函数

constant或者view表示只读。

7、函数修改器

modifier

8、异常处理

  • assert:用于检查变量和内部错误,和throw会标识发生了错误,并回退当前的消息调用产生的状态改变。异常是会执行一个无效操作。
  • require:确保程序执行的必要条件是成立的。在异常发生时会执行回退操作。

以上两种以太坊虚拟机都会撤销所有的状态改变。
但是send、call、delegatecall例外,这些函数会在执行过程中抛出异常时会返回false,而不是自动抛出异常。

9、事件和日志

event{}
或者通过log

10、智能合约的继承

is
合约中的函数都是虚函数,除非制定类名,否则调用的都是最后派生的函数。继承时会从左到右依次继承。
抽象合约:一个合约只有函数生命而没有函数的具体实现这种函数不能被编译,但是能被继承

总结

提示:这里对文章进行总结:

以上就是今天要讲的内容。
在以太坊平台上,智能合约是一段保存在区块链上的逻辑代码,运行在以太坊虚拟机中。

猜你喜欢

转载自blog.csdn.net/qq_53982314/article/details/124326167