《区块链技术与应用》笔记

21-ETH-智能合约

2022-11-29  本文已影响0人  ZeroDot618

声明:本文是要点笔记,介绍和系列笔记均收录在专题:区块链技术与应用

什么是智能合约

智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容。

智能合约的账户保存了合约当前的运行状态:

Solidity 是智能合约最常用的语言,语法上与 JavaScript 很接近。

智能合约代码结构

智能合约代码结构

注意:

外部账户如何调用智能合约?

创建一个交易,接收地址为要调用的那个智能合约的地址,data 域填写要调用的函数及其参数的编码值,如下图所示。

调用智能合约

一个合约如何调用另一个合约中的函数?

1、直接调用的方式

合约调用合约

注意:合约地址只能由外部地址发起交易,合约地址不能主动发起交易。所以,上图最原始一定是有一个外部地址发起合约 B,合约 B 才能调用合约 A。

2、使用 address 类型的 call() 函数的方式

call 调用合约

这两种方式的区别:直接调用方式,被调用的合约出现异常,调用合约的一方也会异常,叫做异常回滚;使用 call 调用方式,被调用的合约出现异常只会返回 false,调用合约的一方继续运行。

3、代理调用 delegatecal() 方式

delegatecal 方式

fallback() 函数

fallback 函数

智能合约的创建与运行

智能合约的代码写完后,要编译成 bytecode。

创建智能合约:外部地址发起一个转账交易到 0x0 的地址。

智能合约运行在 EVM(Ethereum Virtual Machine)上。

以太坊是一个交易驱动的状态机:调用智能合约的交易发布到区块链上后,每个矿工都会执行这个交易,从当前状态确定性地转移到下一个状态

汽油费(gas fee)

gas fee

错误处理

错误处理

嵌套调用

嵌套调用

Block Header 中的汽油费

Block Header

收据树-Receipt 数据结构

Receipt 数据结构

智能合约可以获得的区块信息

智能合约可以获得的区块信息

智能合约可以获得的调用信息

智能合约可以获得的调用信息

地址类型

地址类型

例子-简单拍卖

简单拍卖 1 简单拍卖 2

上图2,存在什么问题?

简单拍卖 3

如果黑客发起攻击,拍卖结束,退款时,所有参与拍卖的人都会收不到钱,包括拍卖胜出者。看看下面第二个版本。

第二个版本-简单拍卖

简单拍卖 4

这样可以了吗?当有黑客如下图那样,会发起重入攻击:

简单拍卖 5

修改后:

简单拍卖 6
上一篇 下一篇

猜你喜欢

热点阅读