001. Solidity 智能合约初识

前言

本文主要是基于 Solidity 官方文档的学习笔记,起到记录的作用,原链接是: https://docs.soliditylang.org/en/v0.8.6/introduction-to-smart-contracts.html

本文目录

  • 区块链基础
    • 区块链的基础名词和概念
  • 以太坊虚拟机
    • 以太坊虚拟机的基础名词和概念
  • 简单的智能合约
    • 介绍一些例子进行初识

区块链基础

  • 区块

    • 区块链为了防止攻击有很多种措施,这些我们都不需要关心,我们需要知道的就是区块链是一个个的区块组成的,而区块链上的交易信息都是储存在区块内的;因为可能会被攻击,所以我们发出去的交易是可以被回滚甚至被抹除的。因为区块链的这个机制,所以等待的时间越长,区块被成功确认的几率就越大。
  • 交易/事务

    • 每一个区块都是对当前网络中数据变化的快照。如果你想通过交易完成一个操作,交易发出去后只有两种状态;要么操作全部完成,要么全部失败。不存在一半完成,一半失败的这种类似于“操作中”的结果。
    • 例子: 你想从账户 A 中转 1ETH 到账户 B,只会得到如下的结果:

      操作成功: 账户 A 减少 1ETH,账户 B 增加 1ETH。
      操作失败: 账户 A 余额不变,账户 B 余额不变。

以太坊虚拟机

以太坊虚拟机简称 EVM,英文的全称是 Ethereum Virtual Machine,EVM 是以太坊网络中智能合约的运行环境。EVM 是沙盒封装的,相互之间完全隔离。

EVM 中运行代码的时候无法访问 网络 / 文件系统其他进程 。甚至智能合约之间的访问也是受限的。

下面介绍一些相关的概念

  • 地址
  • 交易
  • Gas
  • 存储,内存和栈
  • 指令集
  • 消息调用
  • 委托调用/代码调用和库
  • 日志
  • 创建
  • 自毁

地址

以太坊网络主要有两种账户:外部地址合约地址

  • 外部地址: 就是我们导入到 imtoken/matemask 之后显示的那种地址,是由公钥生成的。(私钥可以推出公钥,助记词可以推出私钥。)
  • 合约地址: 在成功创建合约之后确定的(这个地址通过合约创建者的地址该地址发出过的 nonce 生成)

而判断一个地址是否为合约地址,原理是通过查看该地址是否储存合约代码来判断。

无论外部地址,还是合约地址,在 EVM 中是一样的。每个地址都有键值对( key:value )形式的持久化存储,其中 key 和 value 的长度都是 256 位,用来储存该地址相关的信息。

每个地址都有一个以太币余额( balance,单位是 Wei ),余额变化会根据交易转账来改变。

交易

交易是一个地址向另外一个地址发送转账。需要注意以下几点

  • To地址可以和From地址相同,也可以是特殊的零地址
    • 如果To地址和From地址相同,并设置相应的nonce,可以用来取消交易
    • 如果To地址守零地址(账户地址为 0 ),此交易将创建一个 新合约
  • 交易可以包含二进制数据和以太币
    • 如果To地址是合约地址,会触发相应的代码,并以 payload 作为入参。

用来创建合约的交易的 payload 会被转换为 EVM 字节码并执行。执行的输出将作为合约代码被永久存储。这意味着,为创建一个合约,你不需要发送实际的合约代码,而是发送能够产生合约代码的代码。

重要:在合约创建的过程中,它的代码还是空的。所以直到构造函数执行结束,你都不应该在其中调用合约自己函数。 有些合约是防止合约代码来调用,判断不严谨的合约,可以运用这个特性绕过检测。

Gas

为了提高交易效率和为交易支付手续费,ETH引入Gas的概念,EVM执行交易的时候,Gas将按照特定规则逐渐耗尽。

我们可以设置Gas Prices 和 Gas Limit; Gas Price 是你打算支付的Gas价格,Gas Limit是你预付的gas数量。如果最终GasLimit用不完,还会返回原地址。

注意:无论执行到什么位置,一旦 gas 被耗尽(比如降为负值),将会触发一个 out-of-gas 异常。当前调用帧(call frame)所做的所有状态修改都将被回滚。

存储,内存和栈

存储: 每个地址都有一块持久化内存区,称为存储; key 和 value都是256位字符,合约只能读写储存区内属于自己的部分。

内存: 第二个内存区称为内存;合约会试图为每一次交易调用获取一块被重新擦拭干净的内存实例。

指令集

消息调用

委托调用/代码调用和库

日志

创建

自毁

简单的智能合约

免责声明和风险提示

不构成投资建议,更多风险请查看 免责声明

🤗 End,内容已结束 🤗