读《以太坊技术详解与实战》笔记(上)

读《以太坊技术详解与实战》笔记(上)

整体目录

image-20210319171504700

第一章

理解区块链

定义:区块链是一种分布式,去中心化的计算与存储架构

  • 区块链解决什么:如何用一种可信赖的方式记录数据,使得用户可以信任区块链系统记录的数据而无需假设节点的可信性

  • 三个部分:区块链的数据结构、分布式存储、一致性协议

    • 数据结构

    image-20210319172138759

    • 分布式存储

    系统中各个节点组成一个P2P网络,每个节点均分别执行、验证和记录相同的交易,每个节点都可以在本地存储完整的区块链数据

    • 一致性协议
      • POW
      • POS
      • DPOS
      • EOS

以太坊

  • 一种能够被重编程用以实现任意复杂计算功能的单一区块链
  • 用户可以直接开发自己的区块链应用,而无需担心底层的区块链系统
  • 对比比特币的优点
    • 更快的的出块速度以及更先进的奖励机制
    • 以太坊支持智能合约,用户可以自定义数字资产和流通逻辑,可以执行任何计算,但是比特币只支持转账
  • 以太坊发送的交易不仅仅是金额还可以是调用一段代码

智能合约

  • 合约创建
  • 合约调用

应用场景

  • 时间戳和溯源:由于数据区块持续增长且不可篡改,所以可以证明过去某个时间发生过某件事
  • 数字资产的发行和流通:采取统一标准(如ERC20)使得不同商户资产实现流通,比如Q币与支付宝流通
  • 跨组织的数据共享:涉及多家方参与的项目,利用检测自动完成交易或则违约支付

DAPP

  • 去中心化应用( Decentralized Application, DA pp )是一种运行在去中心化点对点(P2P) 网络上的应用软件。
  • 相比于现有中心化软件优点
    • 项目开源,公开透明
    • 去中心化
    • 具有激励机制

实例

  1. Golem
  2. CryptoKittes
  3. Augur
  4. Bancor
  5. KyberNetwork

第二章

以太坊整体架构

  • 底层服务
    • P2P网络服务
    • LevelDB数据库
    • 密码学算法
    • 分片(SHarding)优化
  • 核心层
    • 区块链
    • 共识算法
    • 以太坊虚拟机
  • 顶层应用
    • API接口
    • 智能合约
    • 去中心化应用
  • 概括

image-20210319180616258

底层服务中LevelDB数据库存储了交易、区块等数据,密码学算法为区块的生成、交易的传输等进行加密,分片优化加快了交易验证的速度,共识算法用于解决P2P网络节点之间账本的一致性,顶层应用中的去中心化应用需要在以太坊虚拟机上执行,各层结构相互协同又各司其职,共同组成一个完整的以太坊系统

区块

比特币区块

以太坊区块

preview

两张图对比学习

账户

用户帐户

  • 地址
  • 余额

智能合约账户

智能合约是由事件驱动的、具有状态的、运行在一个可复制的、共享的账本之上的计算机程序,当满足特定条件时,智能合约会自动执行。合约一旦部署不可修改、合约执行后不可逆、所有执行事务可追踪。

  • 地址
  • 余额
  • 状态:智能合约中声明的所有变量和变量的当前状态
  • 代码

地址是账户唯一标识

智能合约能调用其他智能合约

公钥和私钥

img

32byte=256bits

1
2
3
4
5
6
7
8
9
10
11
12
13
14
第一步:私钥 (private key)
  伪随机数产生的256bit私钥示例(256bit 16进制32字节)
  18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
第二步:公钥 (public key)
  1. 采用椭圆曲线数字签名算法ECDSA-secp256k1将私钥(32字节)映射成公钥(65字节)(前缀04+X公钥+Y公钥):
  04
  50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352
  2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
  2. 拿公钥(非压缩公钥)来hash,计算公钥的 Keccak-256 哈希值(32bytes):
  fc12ad814631ba689f7abe671016f75c54c607f082ae6b0881fac0abeda21781
  3. 取上一步结果取后20bytes即以太坊地址:
  1016f75c54c607f082ae6b0881fac0abeda21781
第三步:地址 (address)
  0x1016f75c54c607f082ae6b0881fac0abeda21781

数据结构与储存

  • 数据组织形式
    • Merkle Patircia树(MPT)
    • Merkle树
    • Trie树
  • 状态树:代表访问区块后的整个状态
    • {nonce,balance,code,stroge}
  • 交易树:键值对,每个键是交易编号,值是交易内容
  • 收据树:RLP编码的数据结构 [medstate,Gas_used,logbloom,logs(address,[topic1,topic2])]

数据库支持

image-20210319210450301

共识机制

POW

工作结果证明你完成相应的工作

POS

基于网络参与者目前持有的数字货币的数量与时间进行利益分配

拜占庭将军问题

以太币

ETH

  • 1eth=1e^18wei

交易

  • from:交易发送者的地址,必填
  • to:交易接收者地址,空则代表合约创建交易
  • value:发送者要转移的以太币数量
  • data:存在的数据字段,存在代表交易是创建合约或调用合约交易
  • Gas Limit:表示交易允许消耗的最大Gas数量
  • GasPrice:表示发送者愿意支付给矿工的Gas的价格
  • nonce:用来区别同一用户发出的不同交易标记
  • hash:以上信息生成的散列值,作为交易ID
  • r、s、v:交易签名,发送者的私钥对交易hash进行签名生成

以太坊交易(支持三种data区分)

价值传递
  • TO :收款地址
  • DATA :留空或留言信息
  • FROM :谁发出
  • AMOUNT :发送多少
1
2
3
4
5
web3.eth.sendTransaction({
to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85',
value: 0.0005
data: ‘0x’ // 也可以附加消息
});
创建合约
  • TO :留空 (这就是触发创建智能合约的原因)
  • DATA :包含编译为字节码的智能合约代码
  • FROM :谁创建
  • AMOUNT :可以是零或任何数量的以太,它是我们想要给合约的存款
1
2
3
4
5
web3.eth.sendTransaction({
to: '',
value: 0.0
data: ‘0x6060604052341561000c57xlb60405160c0806……………’
});
调用合约函数
  • TO: 目标合约账户地址
  • DATA: 包含函数名称和参数 - 标识如何调用智能合约函数
  • FROM :谁调用
  • AMOUNT : 可以是零或任意数量的以太,例如可以支付合约服务费用
1
2
3
4
5
web3.eth.sendTransaction({
to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85’, //合约
value: 0.0
data: ‘0x6060604052341561000c57fe5b60405160c0806……………’
});

更详细的过程

数据编码与压缩

RLP编码算法

客户端与API

API库

以太坊域名服务

ENS:使用户注册支持智能合约运行的域名和利用底层设 备标识符解析部分域名

通过竞拍获取

第三章

区块链类型

  • 私有链:指写入权限在某一个组织控制下的区块链,读权限可以公开或加以先知
  • 联盟链:共识过程受到预选节点控制,由不同实体分别控制节点形成授权网络,非联盟节点,只能读取,无权参与共识达成过程
    • Quorum
  • 公有链:主网和测试网,适用于虚拟货币、面向大众的电子商务

image-20210319221335842

安装部署以太坊

此处与书中不同,采取图形化软件Ganache自动化部署

使用参见官方文档

第四章

智能合约

以太坊和智能合约本身只是一个工具,其具体实现的功能和特性由企业和开发者决定 理论上讲,任意计算复杂度的金融交互过程均可以由智能合约安全 自动地完成 除了金 融方面的应用,以太坊平台还可以在如财产登记、投票、智能交通、物联网等任何需要信 任、安全和性能兼顾的环境中进行部署和使用

创建和调用

image-20210319224147956

适用语言

  • Solidioty
  • Serpent
  • LLL

集成开发环境

Remix

存储方式

  • 栈:以太坊虚拟机的底层运行机制
  • 账户储存:作为账户的一个属性保存,与影片一样

  • 内存:以太坊虚拟运行代码时临时分配的一块线性空间,合约调用结束自动释放

指令集

指令集

消息调用

solidity

英文文档

中文文档

第五章

Remix

image-20210319230247382

中文版

简单使用

官方文档