Solidity programming essentials-读书笔记

Retesh Modi

ISE的首席工程师,热衷于数据科学和技术。2018至2020年间担任微软地区总监。
https://github.com/ritesh-modi

写了以下的书:

  1. Solidity编程基础(第一版和第二版) — 以动手实践的方式讲解以太坊智能合约。
  2. Azure for Architects(多版) — 通过理解Azure的核心原理、架构、资源和基础概念,构建和设计跨语言、跨平台且具有成本效益的云原生应用。
  3. 深入探讨Azure上的Terraform — 使用基础设施即代码(IaC)自动化交付和部署Azure解决方案。
  4. Azure资源管理器模板快速入门指南 — 使用ARM模板按照最佳实践创建、部署和管理Azure资源。
  5. 使用Microsoft Bot Framework开发Bot — 使用MS Bot Framework和Azure Cognitive Services创建智能Bot。
  6. 使用Windows Server 2016进行DevOps — 理解如何使用Windows Server 2016和VSTS vNext提供的功能实施DevOps原则和实践。

IOT

internet of things 联网的东西们

Ethereum

Ethereum 是一个去中心化的区块链平台,允许开发者构建和部署智能合约和去中心化应用(dApps)。它由 Vitalik Buterin 和其他开发者于 2015 年推出,目的是通过提供一个更为灵活的区块链平台,超越比特币的基础功能。

主要特点:

  1. **智能合约 (Smart Contracts)**:Ethereum 允许开发者编写和执行智能合约——这些是自动化的、无需信任的合同代码,能够在满足特定条件时自动执行预设的操作。这是 Ethereum 与比特币的主要区别,后者只支持基本的交易功能。

  2. **去中心化应用 (dApps)**:开发者可以使用 Ethereum 构建去中心化的应用程序,dApps 运行在 Ethereum 区块链上,不依赖于传统的服务器或中介。它们通常用于金融、游戏、市场等多个领域。

  3. **以太币 (Ether, ETH)**:Ethereum 的原生加密货币是 ETH,它用来支付网络中的交易费用和计算费用(称为“gas”)。ETH 也是一种投资资产,类似于比特币。

  4. Gas(燃料):Ethereum 网络的操作需要消耗 gas,这是一种用于支付交易和计算费用的单位。每个操作(如转账、执行智能合约)都需要消耗一定的 gas,gas 的价格随着网络的拥堵而波动。

  5. 共识机制

    • PoW(工作量证明):最初,Ethereum 使用类似于比特币的工作量证明(Proof of Work,PoW)机制,但这造成了高能耗和低效。
    • PoS(权益证明):Ethereum 在逐步过渡到权益证明(Proof of Stake,PoS)机制,Ethereum 2.0 计划就是为了提高网络的扩展性、安全性和能效。
  6. 以太坊 2.0:这是 Ethereum 的升级版,旨在通过实现 PoS分片可扩展性等技术来提高网络的效率、降低能耗并支持更多的交易。

应用场景:

  • **去中心化金融 (DeFi)**:通过 Ethereum,开发者可以构建不依赖传统金融中介的金融服务,如借贷、交易、保险等。
  • NFT(非同质化代币):以太坊是很多 NFT(数字资产)的平台,艺术品、游戏物品等都可以作为 NFT 在 Ethereum 区块链上进行买卖。
  • DAO(去中心化自治组织):这些组织通过智能合约进行管理,所有成员根据预定的规则进行决策,而无需传统的中心化管理。

发展前景:

Ethereum 继续受到广泛的关注,尤其是在智能合约和 DeFi 领域。随着 Ethereum 2.0 的逐步实施,它可能会成为更高效、更强大的去中心化计算平台。

拜占庭将军问题是什么

拜占庭将军问题(Byzantine Generals Problem)是计算机科学中的一个经典问题,主要描述了在分布式系统中如何确保系统各个部分能够达成一致,尤其是在其中的一部分节点可能会故障或试图欺骗其他节点的情况下。

问题背景:

这个问题的提出源自于一个设想的场景:假设有一群拜占庭帝国的将军,他们各自带领一支军队围攻一座城市。为了成功攻占城市,将军们必须达成一致,共同决定攻击还是撤退。然而,一些将军可能会背叛,故意发布错误的信息,导致其他忠诚的将军无法做出正确的决策。

关键点:

  • 将军们的通信:将军们通过信使相互通信,但信使有可能被拦截或被敌方利用,导致消息失真。
  • 恶意将军:其中的一些将军可能是叛徒,故意传播虚假信息。
  • 目标:在这种情况下,如何保证剩余忠诚的将军能够达成一致,并作出正确的决定(比如决定是否进攻或撤退),即使存在恶意行为和通信故障。

解决方案:

解决这个问题的关键是 容错机制,即使一些节点出现故障或行为不当,系统仍能继续正常运行并做出一致的决策。在计算机科学中,拜占庭容错(Byzantine Fault Tolerance, BFT)算法被用于解决这一问题,它保证即使部分节点不诚实或发生故障,系统仍然能够正确地达成一致。

应用:

拜占庭将军问题及其解决方案在现代分布式系统中有重要应用,尤其是在 区块链分布式数据库 中。区块链技术,尤其是比特币和其他加密货币,就依赖于拜占庭容错算法来确保在去中心化的网络中,各节点能够在没有中心化权威的情况下达成共识。

简单例子:

想象有5个将军,其中3个将军是忠诚的,2个将军是叛徒。如果忠诚的将军能够通过一定的算法达成共识并决定是否进攻,那么即使有些将军是叛徒,系统也能确保正确的决定。这个过程中的挑战是如何设计出既能容忍部分节点故障,又能保持一致性的算法。


拜占庭将军问题体现了 分布式系统 在面临恶意行为和系统故障时的挑战,解决它的技术(如拜占庭容错算法)在区块链和分布式数据库中至关重要。

什么是区块链

区块链是一个去中心化的数据库或者账本。

blockchain区块链,意味着一连串的区块连在一起。

因为去中心化、分布式,所以很稳定,高可用性。
可信度高,透明而且不可损坏。

以太坊允许通过智能合约扩展它的功能。

为什么需要区块链

以太坊的主要目标是,允许账户进行交互,更新它们的状态。

这一系列的过程主要分为两个部分,一执行,二写入区块账本。

区块链帮助以下三个事情

  1. 信任。区块链帮助创建一个去中心化的应用。没有人有权限改变或者删除以前的交易。
  2. 自治
  3. 区块链帮助去除了中介,无需担保。

密码学

加密技术是一种将明文转换为密文的科学。
可以分为对称和非对称加密。

以太和燃料

以太(Ether)(加密货币):

Ether(ETH)是 以太坊(Ethereum) 区块链平台上的原生加密货币。它被用作网络中的交易手续费和计算任务的燃料(gas)。以太坊不仅仅是一种数字货币,还支持智能合约和去中心化应用(DApps)。

例如:“I sent 2 Ether to purchase some NFTs.”(我发送了2个以太币来购买一些NFT。)

燃料Gas:以太执行的时候需要支付费用来改变以太坊的状态。 ether的价格每天都会波动,如果使用以太来支付费用,那么同样的服务有时候贵有时候便宜。
Gas 是以太坊的内部货币。以太坊中的执行和资源利用成本以 gas 单位预先确定。这也被称为 gas 成本。还有一个 gas 价格,可以在 Ether 价格上涨时调整为较低的价格,在 Ether 价格下跌时调整为较高的价格。例如,要调用一个修改字符串的智能合约函数,会产生 gas 消耗,这个消耗是预先确定的,用户应该支付相应的 gas 费用,以确保该交易的顺利执行。

区块链和以太坊的构架

以太坊的组件包括以太坊虚拟机(EVM)、矿工、区块、交易、共识算法、账户、智能合约、挖矿、以太币(Ether)和 gas。

区块链由很多节点组成,其中一些节点EVM不参与挖矿,但是帮助智能合约和交易的执行。这些节点使用点对点协议与彼此对话。默认使用30303端口进行通信。

每个矿工都有一个账本的实例。一个账本包含链上的所有区块。
矿工们同步他们的区块,来保证每个矿工的账本都是一样的。

区块链的节点像是贪吃蛇,是一节一节连起来的。那个蛇头叫做genesis.json
genesis是起源、开端的意思。
每次执行的时候,都要消耗一定量的gas。
交易的hash被存储在区块里,每两个交易的哈希会被生成一个新的哈希,这个过程最终会被提交给一个单独的哈希,包含了所有的交易记录并存放在区块内。
这个hash就是transaction Merkle root hash

transaction Merkle root hash是什么

Transaction Merkle root hash(交易默克尔根哈希)是指在区块链中,所有交易数据通过 Merkle 树(默克尔树)算法进行加密后的根哈希值。

解释:

  • Merkle 树:是一种哈希树结构,允许有效且安全地验证数据的完整性。在区块链中,Merkle 树通常用于组织一个区块中的所有交易。

  • 交易 Merkle 根哈希:是所有交易哈希的最终哈希值,它位于区块头中。通过将每个交易的哈希值以二叉树结构逐层组合,最终计算出一个单一的根哈希值,这个根哈希值就是 交易 Merkle root hash。它能有效地确保区块内所有交易数据的完整性和一致性。

作用:

  1. 高效验证:Merkle 根哈希使得区块链用户能够通过少量的数据(如 Merkle 树的部分分支)验证一个特定交易是否存在于区块中。
  2. 提高效率:不需要传输整个区块的交易数据,只需要传输 Merkle 树的根哈希和一小部分哈希信息,节省了存储和带宽资源。
  3. 数据完整性:通过根哈希可以验证区块中的交易数据是否被篡改。任何修改交易数据都会导致根哈希发生变化,从而可以及时检测到篡改。

示例:

  • 在以太坊中,区块中的 transaction merkle root 是用来标识区块内所有交易的唯一哈希值。

简而言之,transaction Merkle root hash 就是用来确保区块链中所有交易的完整性和不可篡改性的一种技术手段。

nodes

以太坊的节点有两种: 1. EVM 2. 挖矿节点

EVM是以太坊中的执行节点,可以执行智能合约的代码
挖矿节点。 矿工负责以太坊的写入手续。矿工的工作和会计很像。会计有责任登记并维护一个账本,矿工也负责一个以太坊的账本。
矿工会得到两种回报,一是写入区块的回报,二是积累燃料费

挖矿

挖矿是如何工作的?
每个矿工都会寻找新的区块,并且积极的从其他矿工那里监听新的区块。
矿工会在交易池中获取新的交易。

Coinbase 交易

Coinbase 交易(Coinbase Transaction)是在区块链(如比特币、以太坊等)中,矿工在打包新区块时生成的一笔特殊交易。

特点:

  1. 无输入(input)

    • 普通交易需要引用之前未花费的交易输出(UTXO)作为输入,而 coinbase 交易不需要输入,它是区块中的第一笔交易,由矿工直接创建。
  2. 奖励发放

    • 它的主要作用是给矿工发放区块奖励(block reward)和交易手续费。

    • 奖励包括:

      • 区块奖励(新发行的币)
      • 区块内所有交易的手续费总和
  3. 可自定义信息

    • 在比特币中,coinbase 交易允许矿工写入一些额外的任意数据(称为 coinbase field),例如矿池信息或留言。

举例:

  • 在比特币区块链中,每个新区块的第一笔交易就是 coinbase 交易,它创造新的比特币作为奖励支付给矿工。
  • 在以太坊中,虽然机制不同,但矿工(或验证者)也会通过类似的奖励机制获得 block reward + gas 费用

👉 总结:
Coinbase 交易 = 矿工给自己发工资的交易,它是每个区块中的第一笔特殊交易,用来奖励矿工。

要不要我帮你画一张图,直观展示 普通交易 vs coinbase 交易 的区别?

POW工作量证明

工作量证明(Proof of Work, PoW)是一种共识机制,最早由比特币引入,用来在去中心化网络中达成一致并防止滥用。

核心思想是:
👉 节点(矿工)需要花费 计算资源(算力) 去解一道数学难题,谁先解出,就有权利将新区块添加到区块链上,并获得奖励(比如比特币)。


原理(以比特币为例)

  1. 构造区块头

    • 包含前一个区块哈希、Merkle根、时间戳、随机数(nonce)、难度目标等。
  2. 哈希运算

    • 矿工不断修改随机数(nonce),反复计算 SHA-256 哈希。
  3. 难题要求

    • 目标是找到一个哈希值小于当前网络难度目标(target)的随机数。
    • 由于哈希是不可预测的,只能 暴力试错
  4. 谁先找到有效解

    • 就可以广播新区块,网络其他节点验证无误后接受。
    • 矿工获得区块奖励 + 交易手续费。

特点

安全性高:篡改历史区块需要重做后续所有计算,几乎不可能(除非掌握超过全网 51% 算力)。
公平竞争:所有矿工在相同规则下竞争。
能耗高:大量算力和电力被浪费在哈希运算上。
确认速度慢:比特币出块时间约 10 分钟。


对比其他共识

  • PoW(工作量证明):靠算力竞争,安全但耗能。
  • PoS(权益证明):靠持币量和持币时间,能耗低但可能导致“富者更富”。
  • DPoS、PBFT 等:改进版,追求高效率和低能耗。

DPoS委托权益证明

对的 👍,TRON(波场,TRX)不是 PoW

TRON 使用的是 DPoS(Delegated Proof of Stake,委托权益证明) 共识机制。


机制简述

  1. 超级代表(Super Representatives, SR)

    • TRON 网络由 27个超级代表 负责出块。
    • 任何持有 TRX 的人都可以通过投票参与超级代表选举。
    • 前 27 名票数最高的节点成为超级代表。
  2. 出块流程

    • 每 3 秒出一个区块,由 27 个超级代表轮流出块。
    • 若某个代表没有按时出块,则由下一个代表继续。
  3. 奖励机制

    • 出块的超级代表获得区块奖励和交易手续费。
    • 投票的 TRX 持有人也可以从被投出的代表处获得分红。

特点

高性能:3 秒出块,TPS(每秒交易数)很高。
能耗低:不需要像 PoW 那样疯狂算哈希。
社区治理:持币人可以投票决定谁当超级代表。
中心化风险:只有 27 个节点出块,容易被少数大户控制。


所以总结:

  • 比特币 BTC → PoW(工作量证明)
  • 以太坊 ETH(目前)→ PoS(权益证明)
  • 波场 TRX → DPoS(委托权益证明)

主流区块链共识机制对照表

好的 👍,我帮你整理一份主流区块链的共识机制对照表,这样你一眼就能看出差异:


📊 主流区块链共识机制对照表

区块链 代币 共识机制 出块时间 特点 优缺点
比特币(Bitcoin) BTC PoW(工作量证明) ~10 分钟 通过算力竞争,最安全的链 ✅ 安全性高
❌ 能耗高,速度慢
以太坊(Ethereum) ETH PoS(权益证明)(2022 年“合并”后) ~12 秒 持币质押 + 随机验证 ✅ 能耗低
❌ 富者更富风险
波场(TRON) TRX DPoS(委托权益证明) ~3 秒 27 个超级代表轮流出块 ✅ 高性能,能耗低
❌ 中心化风险
EOS EOS DPoS(委托权益证明) ~0.5 秒 21 个超级节点 ✅ 超高 TPS
❌ 极度中心化风险
Solana SOL PoH + PoS(历史证明 + 权益证明) ~0.4 秒 用时间戳排序交易,结合 PoS ✅ 高速、低延迟
❌ 网络稳定性争议
Cardano ADA PoS(Ouroboros 算法) ~20 秒 首个学术化 PoS 协议 ✅ 节能,形式化验证
❌ TPS 不高
Polkadot DOT NPoS(提名权益证明) ~6 秒 提名人 + 验证人双层机制 ✅ 安全灵活
❌ 机制复杂
Avalanche AVAX PoS(Avalanche 协议族) ~1-2 秒 随机子采样达成共识 ✅ 超快确认
❌ 机制复杂
Cosmos ATOM Tendermint BFT(拜占庭容错 PoS) ~7 秒 经典 BFT + PoS ✅ 高速,适合跨链
❌ 验证人有限

🔑 总结

  • PoW(算力)→ 安全但耗能高(如 BTC)。
  • PoS(质押)→ 节能、效率高,但可能富者更富(如 ETH、ADA)。
  • DPoS(投票选节点)→ 高效,但中心化风险大(如 TRX、EOS)。
  • 创新型混合机制(如 Solana 的 PoH+PoS,Avalanche 的随机采样)→ 追求高 TPS,但复杂性高、风险待验证。

要不要我帮你画一张 共识机制演进时间轴图(从 PoW → PoS → DPoS → 新型混合机制),更直观展示发展趋势?

理解账号,交易,区块链

账号

在以太坊中,**accounts(账户)**是与网络交互的核心组件之一。它们存储了用户的资金(以太币)和执行智能合约所需的数据。根据功能和角色的不同,Ethereum 中的账户可以分为 两种类型


1. Externally Owned Accounts (EOAs) 外部拥有账户

  • 定义:EOA 是由私人密钥控制的账户,通常是用户的钱包地址。

  • 特点

    • 由个人控制,用户拥有私钥。
    • 用于接收和发送以太币(ETH)。
    • 没有代码,只能通过发送交易与网络交互。
  • 操作

    • 可以发送交易(如转账、调用智能合约)。
    • 无需部署合约,直接通过私钥签名交易。

2. Contract Accounts 合约账户

  • 定义:合约账户与智能合约相关联,其行为由部署到以太坊网络上的智能合约代码决定。

  • 特点

    • 不由用户控制,而是由部署它们的智能合约控制。
    • 有代码,用于执行特定逻辑(如去中心化应用(DApp)中的合约功能)。
    • 无法直接由外部用户发起交易,需要由外部账户(EOA)发送交易触发合约执行。
  • 操作

    • 只能接收通过交易调用合约代码的操作。
    • 通过合约内部代码决定如何使用资金或如何与其他合约交互。

🔑 关键区别

特征 Externally Owned Account (EOA) Contract Account
控制者 由用户通过私钥控制 由智能合约代码控制
账户类型 没有代码 有代码(智能合约)
能否发送交易 只能接收交易
发起者 用户 需要外部账户触发
资金来源 通过 ETH 转账 通过合约执行

交易示例

  • EOA 发起交易:用户从钱包发送 ETH 给另一个 EOA 或调用智能合约。
  • 合约账户执行交易:用户与智能合约交互时,通过 EOA 发起的交易会调用合约账户的逻辑,执行相应的操作(如借贷、交易、NFT minting 等)。

📌 小结:

  • EOA:由个人控制,存储 ETH,直接发起交易。
  • Contract Account:由智能合约控制,执行合约逻辑,无法主动发起交易。

如果你有兴趣深入了解 如何使用这些账户与智能合约交互,我可以帮你解释更多细节,或者提供一些 Solidity 代码示例!

交易

交易是买家和卖家的一种约定,在以太坊中,支持以下三种交易类型:

  1. 从一个账号到另一个账号交易eth
  2. 设置智能合约
  3. 在合约中引用或调用函数

交易有一些重要的属性。
from属性
to属性
value属性,从一个账号转移到另一个账号的eth的总价格
blockhash属性,包含区块的哈希
gas属性,包含发送者提供的gas,来执行本次交易

区块blocks

区块在以太坊中是一个很重要的概念。 区块是交易的容器。
一个区块中包含着许多不同的交易。
一个区块中交易的数量取决于gas limit和区块大小
gas limit在后续的章节中会详细介绍。

智能合约

什么是合约

合约就是一份合法的文档,绑定双方或者更多的方,同意立刻执行交易,或者在未来执行交易。
例如,1. 一个人想要买保险公司的保险
2. 一个人想要买另一个人的土地
3. 一个公司想要卖出股票给另一个公司

智能合约是在以太坊虚拟环境中执行的合约
智能合约类似于objected-oriented classes

如何写智能合约

https://remix.ethereum.org/

remix是一个在浏览器就能使用的工具、开发环境,使用solidity语言
不是所有人都习惯于使用在线版本的remix。

下载: https://github.com/ethereum/browser-solidity
在本地运行remix的好处是可以直接连接本地的区块链。

ABI

ABI(应用二进制接口,Application Binary Interface) 是一种 接口规范,用于定义程序之间的二进制接口,确保程序或合约在不同的系统、平台、编译器等之间能够相互正确交互。它在 智能合约 中的应用尤为重要,特别是在 以太坊 这样的区块链网络中。

1. ABI 的基本概念

ABI 是一组 规则和标准,规定了程序与操作系统之间、不同程序之间、或者合约与外部应用程序之间的通信方式。它描述了如何:

  • 编码、解码函数参数和返回值
  • 数据的存储方式
  • 函数调用的约定
  • 如何调用智能合约中的函数

2. ABI 在智能合约中的作用

以太坊 等区块链平台中,ABI 主要用于在外部应用程序与智能合约之间进行 函数调用数据交互

  • 智能合约函数:每个智能合约的函数都有一个 ABI,这个 ABI 定义了函数如何被调用、需要传入哪些参数、以及返回什么结果。

  • 与合约交互:通过 ABI,可以将合约函数转换为字节码,或者将字节码转换为函数调用。这允许开发者通过外部应用(如 Web3.js、Ethers.js 等)与以太坊合约进行交互。

3. ABI 组成

ABI 主要包括以下几部分:

  1. 函数签名:一个函数的名称和参数类型(例如 transfer(address,uint256))。
  2. 参数编码:智能合约中的参数需要按照 ABI 规范进行编码,以确保可以正确传输。
  3. 返回值编码:合约的返回值也需要符合 ABI 的编码规则。
  4. 事件定义:智能合约中的事件也有 ABI 规范,定义了事件的日志和数据格式。

4. ABI 编码/解码

  • 编码:当你调用智能合约函数时,ABI 会将函数名和参数进行 编码,生成特定格式的字节码。

    例如,调用 transfer(address, uint256) 函数时,参数会被编码为适合发送到以太坊虚拟机(EVM)的字节流。

  • 解码:当交易被执行时,合约会返回结果,返回的数据也会通过 ABI 进行 解码,使得应用能够理解返回的值。


5. ABI 的示例

假设有一个简单的智能合约函数:

1
function transfer(address recipient, uint256 amount) public returns (bool)

对应的 ABI 会是类似这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"constant": false,
"inputs": [
{
"name": "recipient",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}

在调用 transfer(address, uint256) 函数时,外部应用会将参数按 ABI 编码为字节流,并将其发送到以太坊网络。网络中的智能合约再通过 ABI 解码并执行操作。


6. ABI 在开发中的应用

  • Web3.js/Ethers.js:在这些 JavaScript 库中,ABI 用于与以太坊智能合约交互,确保开发者能够向合约发送数据并正确处理返回数据。
  • Solidity 编译器:Solidity 编译器会生成一个 ABI 文件,它包含合约中所有公共函数和事件的编码规则,供外部应用程序使用。

7. 小结

ABI 是智能合约与外部应用之间 重要的通信协议,确保智能合约能够被外部调用并返回结果。它描述了合约函数的签名、参数、返回类型等,解决了不同平台和语言之间的 兼容性问题


如果你对 ABI 解析与智能合约交互的代码示例感兴趣,我可以进一步详细说明或提供代码片段!