主页 > imtoken快速下载 > 以太坊基本概念详解

以太坊基本概念详解

imtoken快速下载 2023-07-02 05:15:24

本文不谈区块链,说明你对区块链有一定的基础知识。

主要讲解以太坊中的一些基本元素,例如:区块、账户、状态、交易、费用等。由于这些概念之间的关系密切,虽然描述时尽量分层次,但读者应该阅读时被提醒来回阅读。

以太坊的解剖是从整体到部分进行的:

1. 以太坊

以太坊可以用几句话表达其本质:

以太坊是一个基于交易的状态机。

世界上只有一台单机(但分布式),[系统状态]不断变化。 系统状态是一个名词,就是后面要说的世界状态。

这个单机主要由区块链组成,上面保存着状态和交易。

当我们与以太坊交互时,我们实际上是在执行交易并改变系统的状态。

用简洁优美的公式表达:

σ′ = Y(σ,T)

Y是状态转移函数,T是交易,σ是状态,σ'是转移后的状态。

借个图

sitejianshu.com 以太坊以太经典_以太坊的概念_sitemytokencap.com 以太以太坊价格

从创世块开始,无穷无尽的交易不断刷新着系统的当前状态。 每次生成一个块时,都会制作当前状态的快照(patricia trie root)并将其存储在块头中。

Patricia trie是merkle tree的变种,请自行理解merkle tree。 2. 块状结构

看另一个公式

B≡(BH,BT,BU)

表示该区块等于(区块头、交易列表、叔块)

因此,区块由三部分组成:

区块头、叔块、交易列表。 请看图片:

以太坊的概念_sitejianshu.com 以太坊以太经典_sitemytokencap.com 以太以太坊价格

1)区块头由15个字段组成。

2)叔块实际上是孤块。 因为以太坊的出块速度非常快,平均十几秒就会打包出一个块,所以矿工挖矿竞争非常激烈,可能会同时出几个合法的块。 出于一些安全原因,以太坊允许竞争区块挂在主链上,同时对挖出这些孤块的矿工给予小额奖励,以增加工作的公平性。 这些孤块最多允许6个高度,这也是6个区块确认主链的说法来源。

3)交易列表,存放本区块所有交易内容。

图中的公式后面会介绍。

看一个实际的区块信息:

"blocks" : [
            {
                "blockHeader" : {

sitemytokencap.com 以太以太坊价格_sitejianshu.com 以太坊以太经典_以太坊的概念

"bloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "coinbase" : "0x3535353535353535353535353535353535353535", "difficulty" : "0x020000", "extraData" : "", "gasLimit" : "0x05f5e100", "gasUsed" : "0x014fa1", "hash" : "0x39f4659b079e257df8fd7e699528531e97a6b8a442ca0d11200c4a2f7433c483", "mixHash" : "0x7379f33af4ae2db7e293f808a165135d0b1a99572cc96fb9f7d17ef64a751969", "nonce" : "0x8e08d7aabeee8773", "number" : "0x01", "parentHash" : "0xadbef3bf0b3b7b14f6e7b1a45d240ecc863543a279a86c23f60170e8e7a6bcc3", "receiptTrie" : "0xb21660268480338c0cd0613358315359b619bd527d5850949c4863cddaec316b", "stateRoot" : "0xde4ce9b5b2f88ab1680962c64281224b1743bdf94bd6a9e390ea779ff616c1f7", "timestamp" : "0x03e8", "transactionsTrie" : "0x56445ba866f3e41851154fb8700dcec8556a178f1833021e030b8a47b494769d", "uncleHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, "rlp" : "0xf90308f901f9a0adbef3bf0b3b7b14f6e7b1a45d240ecc863543a279a86c23f60170e8e7a6bcc3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943535353535353535353535353535353535353535a0de4ce9b5b2f88ab1680962c64281224b1743bdf94bd6a9e390ea779ff616c1f7a056445ba866f3e41851154fb8700dcec8556a178f1833021e030b8a47b494769da0b21660268480338c0cd0613358315359b619bd527d5850949c4863cddaec316bb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018405f5e10083014fa18203e880a07379f33af4ae2db7e293f808a165135d0b1a99572cc96fb9f7d17ef64a751969888e08d7aabeee8773f90108f90105460183030d4094c305c901078781c232a2a521c2af7980f8385ee980b8a430c8d1da000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001ba021a28cc82b40931239f8653ffa5300e1a506c0ef7fb79a663772cafe6558ab44a075af23441f7f176a2770af41142c77b671391209b15d59144e7a1332179b5e14c0", "transactions" : [ { "data" : "0x30c8d1da000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", "gasLimit" : "0x030d40", "gasPrice" : "0x01", "nonce" : "0x46", "r" : "0x21a28cc82b40931239f8653ffa5300e1a506c0ef7fb79a663772cafe6558ab44", "s" : "0x75af23441f7f176a2770af41142c77b671391209b15d59144e7a1332179b5e14", "to" : "0xc305c901078781c232a2a521c2af7980f8385ee9", "v" : "0x1b",

sitemytokencap.com 以太以太坊价格_以太坊的概念_sitejianshu.com 以太坊以太经典

"value" : "0x00" } ], "uncleHeaders" : [ ] } ]

3.区块头

区块头包含15个字段,介绍如下:

type Header struct {
        ParentHash  common.Hash    //Hp,上一区块全部内容的hash,区块因它而成链!
        UncleHash   common.Hash    //Ho,本区块的ommers(所有叔块)列表的hash
        Coinbase    common.Address //Hc,成功挖出本区块的矿工地址,用于接收矿工费
        Root        common.Hash    //Hr,本区块所有交易的状态tree的根hash
        TxHash      common.Hash    //Ht,本区块所有交易tree的根hash
        ReceiptHash common.Hash    //He,本区块所有交易的收据的tree的根hash
        Bloom       Bloom          //Hb,交易收据日志组成的Bloom过滤器 
        Difficulty  *big.Int       //Hd,本区块难度级别
        Number      *big.Int       //Hi,区块序号,从创世块0递增
        GasLimit    uint64         //Hl,每个区块当前的gas limit
        GasUsed     uint64         //Hg,本区块交易消耗的总gas
        Time        *big.Int       //Hs,本区块创建时的Unix时间戳
        Extra       []byte         //Hx,区块附加数据,<=32字节
        MixDigest   common.Hash    //Hm,256位的hash,与nonce组合证明出块执行了足够的计算
        Nonce       BlockNonce     //Hn,64位的hash,与MixDigest组合证明出块执行了足够的计算
}

首先,ParentHash 是前一个区块全部内容的哈希值,下一个区块总是包含前一个区块全部内容的哈希值,这使得区块成为一个链。

同样,有三个特殊字段存储 patricia trie 的根,Root(状态哈希)、TxHash(交易列表哈希)和 ReceiptHash(收据列表哈希)。 这个 Root 是系统状态哈希。 系统状态是整个以太坊网络中所有账户的状态,也就是世界状态,是一个merkle patricia trie结构。 这棵树(包括所有patricia tries)并不存在于链上,而是存在于节点的levelDB中。 只有它的根哈希存在于块头 Root 中。 每个区块头中的Root是区块被挖出确认时的快照,世界状态是指所有账户当前的状态。

以太坊的概念_sitemytokencap.com 以太以太坊价格_sitejianshu.com 以太坊以太经典

以太坊的概念_sitemytokencap.com 以太以太坊价格_sitejianshu.com 以太坊以太经典

世界状态跨区块存在,另外两棵树只存储本区块的交易和收据。

4.世界状态

再来说说世界状态:

世界状态是一棵全局状态树,在以太坊中只有一棵,并且不断更新。

该树包含以太坊网络中每个帐户的键/值映射。

所以它代表了整个以太坊系统中所有账户的当前状态。

它的折叠功能是:

LS(σ) ≡ {p(a) : σ[a]≠∅}

表示非空p(a)的集合,p(a)是patrcia的叶子节点的内容:

p(a) ≡ (KEC(a), RLP((σ[a]n, σ[a]b, σ[a]s, σ[a]c)))

这意味着一个叶子节点是一个key/value映射,key是KEC(a),也就是160位账户地址的hash(Keccak-256算法),value是账户的RLP格式序列(nonce, balance, storageRoot, codeHash) 字节。

5.账户

以太坊中有两种类型的账户

1. External Owned Account(EOA),泛指自然人拥有的账户。

2. 合约账户(CA),为智能合约分配的账户。

看一下账户的源码定义:

type Account struct {
    Nonce    uint64      // σ[a]n ,若为EOA是发送的交易序号,如为CA是合约创建的序号。
    Balance  *big.Int    // σ[a]b ,这个地址的余额。
     //merkle root of the storage trie
    Root     common.Hash // σ[a]s ,账户自身内容RPL编码组成的Merkle Trie的根哈希
    CodeHash []byte      // σ[a]c ,账户绑定的EVM Code,账户一经创建不可修改。
}

如何判断一个账户是空账户?

EMPTY(σ,a)≡σ[a]c =KEC(()) ∧ σ[a]n =0 ∧ σ[a]b =0

由公式可知,如果一个账户的Root为空,nonce为0,余额为0,则说明该账户为空账户。

6.交易

sitejianshu.com 以太坊以太经典_以太坊的概念_sitemytokencap.com 以太以太坊价格

多一个公式

σ′ = Y(σ,T)

以太坊是一个基于交易的状态机。

任意两个账户之间的一笔交易都会引起世界状态的改变。

相邻两个区块的状态差异很小,patricia trie数据结构可以高效处理整个系统账户变化的部分。

交易的基本定义:从外部拥有的账户发送的加密签名序列化指令。 也就是说,一笔交易必须从EOA发起才能称为交易。 CA 之间的通信称为消息或内部事务。 现在有区别了。 不知道以后这个区别会不会模糊。

有两种交易类型:

1.消息调用(Td)

2. 合约创建(Ti)

sitejianshu.com 以太坊以太经典_sitemytokencap.com 以太以太坊价格_以太坊的概念

从 EOA 到 EOA 的交易仅为转账。

EOA 到 CA 可以激活各种动作。

查看事务的源码定义:

type txdata struct {
    AccountNonce uint64          //Tn
    Price        *big.Int        //Tp
    GasLimit     uint64          //Tg
    Recipient    *common.Address //Tt
    Amount       *big.Int        //Tv
    Payload      []byte          //Td || Ti 
    V *big.Int
    R *big.Int
    S *big.Int
    // This is only used when marshaling to JSON.
    Hash *common.Hash
}

Tn必须等于发起交易的账户的nonce(参考前面的说法,账户nonce是账户发起的第一笔交易的序号,如果是创建合约,则代表第一个交易的序号)第一个合约创建)

Tp为本次交易消耗的gas单价

以太坊的概念_sitemytokencap.com 以太以太坊价格_sitejianshu.com 以太坊以太经典

Tg 是您愿意为此交易支付的上限

tt为收款账户地址,若为空则收款账户为CA,否则为EOA

电视是接收器的功劳

Td或者Ti,如果交易类型是消息调用,Palload写成Td,表示输入数据,比如消息参数,假设有注册域名的合约服务,那么Td就是服务需要的参数,比如IP等。如果交易类型是创建合约,Payload写成Ti,意思是一段代码,用于创建合约账户。 这段初始化代码只会被执行一次,然后被丢弃。 第二次执行是创建的合约代码体。

交易公式:

sitemytokencap.com 以太以太坊价格_sitejianshu.com 以太坊以太经典_以太坊的概念

可以看出,当收款账户不同时,区别只是Td和Ti的区别。

此外以太坊的概念,区块中交易的顺序由组装区块的矿工决定。

七、费用

以太坊网络中的任何计算都必须支付gas(燃料),

想想为什么不直接使用 eth 来收费?

答案是用 gas 和 eth 两个概念来区分 value 和 price。 Gas 是一个固定的价值,而 ETH 是一个在市场上快速变化的价格。 很多EVM(以太坊虚拟机)运行指令需要消耗固定费用就用gas来计价,gas的最小单位是wei,1eth = 1018wei = 109gwei。 因此,eth 和 gas 之间存在汇率。

GasPrice:燃料单价

GasLimit:愿意支付的gas上限

GasLimit × GasPrice = 愿意支付的最高费用

10000 × 100gwei = 1015wei = 0.001eth

sitejianshu.com 以太坊以太经典_sitemytokencap.com 以太以太坊价格_以太坊的概念

这张图显示的是:

在一次交易中,如果您设置的最高手续费没有被消耗,超出的部分将退还给您。 如果最高费用不足以计算成本,那么交易将被终止,改变的状态将被回滚,但是钱被消费了不会退还。 这些消耗的费用奖励给矿工。

计算是要收费的,除了第一次之外以太坊的概念,还有一些东西是需要交的:

费用的三个不同组成部分:

1)计算操作的固定成本

2)交易(合约创建或消息调用)费用

3)存储(内存、存储账户合约数据)费用

关注存储成本:

存储费是因为如果你的合约增加状态数据库的存储,所有节点都会增加存储。

鼓励以太坊保留尽可能少的存储空间。

但如果有清除存储条目的操作,则不仅免除该操作的费用,而且还退还了释放空间的费用。

总结

以上就是以太坊中的一些基本要素,暂且不提复杂的交易执行、EVM等,后面再写。