以太坊在加密货币领域内无疑是颗璀璨的明星。其背后,那复杂且独特的运作机制,由区块、账户、状态、交易、费用等基本元素构成,它们如同精密机器的零件,虽小却至关重要。这些元素不仅蕴含着巨大的价值,更是理解以太坊的核心所在。
一区块结构
以太坊的区块结构颇为特别。它由区块头、交易列表和叔块三部分构成,这三者之间的关系是固定的。区块头中记录了上一个区块所有内容的哈希值,这一环节对于区块链的形成至关重要。在实际操作中,比如在以太坊主网中,每当新产生一个区块,系统都会检查上一个区块的哈希值,以此构建起连续的区块链。同时,每当产生一个新区块,系统都会对当前状态进行快照,并将其存储在区块头中。在此过程中,孤块最多只能有6个高度,这也正是6个区块确认主链这一说法的由来。
交易列表中记录了本区块内的全部交易信息。区块链的核心是由众多区块构成的,而这些区块所具备的特性,正是以太坊正常运行不可或缺的保障。
二账户及其特性
"blocks" : [
{
"blockHeader" : {
"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",
"value" : "0x00"
}
],
"uncleHeaders" : [
]
}
]
以太坊的账户有着独特之处。简言之,系统状态实际上是指以太坊网络中所有账户的状态总和。这被称为worldstate,它采用trie结构。每个账户都有其独立的状态,比如交易序号等。类似地,在区块链应用中,每位用户的以太坊账户都会记录其相关的操作历史。
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组合证明出块执行了足够的计算
}
账户的nonce具有特殊含义,它标志着账户进行的交易序号。如果是创建合约的情况,这个序号就表示这是第几次创建合约。这一特性使得以太坊系统能够精确地识别每个账户的交易顺序及其他相关信息。
三状态的意义
以太坊中,状态扮演着至关重要的角色。所谓的系统状态,亦即worldstate,是跨越多个区块持续存在的。在每个区块的头部,都有一个Root,它记录了区块被挖掘并确认时的worldstate快照。这里的worldstate,指的是当前所有账户的状态,也就是说,它反映了以太坊系统中所有账户此刻的状态。
在实际操作中,每次交易发生,都会导致worldstate发生变化。这种变化通常体现在任意两个账户之间。虽然相邻区块间的状态差异不大,但trie这种数据结构却能高效地处理整个系统中账户状态的变化部分。
四交易的构成
交易在以太坊系统中扮演着核心角色。简单来说,它是由外部账户发出的、经过加密签名的序列化指令。交易中包含众多关键要素,比如Tn值必须与发起交易账户的nonce值相等。交易类型不同,相应的参数也有所区别,比如Td或Ti。当交易是消息调用时,Td代表输入数据,例如注册域名合约服务时所需的IP等参数。而若是创建合约的交易,则Ti表示一段代码,这段代码仅执行一次后就会被丢弃,后续执行的是已创建合约的代码体。这些定义确保了以太坊交易的有条不紊和精确执行。在众多以太坊应用中,这些规则保证了各类交易能够顺畅进行。
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,账户一经创建不可修改。
}
五费用的度量
以太坊中费用的计算方式颇为特别。其中,gas和eth两个概念被用来区分价值与价格。gas代表一种固定的价值衡量单位,比如,在以太坊虚拟机中,许多操作指令所需的固定费用都是以gas来标价的,它的最小单位是wei。与此同时,eth则是市场上不断波动的价格。此外,存储服务同样会收取费用,这是因为一旦合约导致状态数据库存储量增加,所有节点都需要承担额外的存储成本。这一措施旨在保持以太坊网络资源管理的平衡。
六总结与展望
我们已对以太坊的基础要素进行了详尽剖析,诸如区块、账户、状态、交易与费用等。这些要素共同构成了以太坊运作的基石。然而,这只是入门,以太坊的交易执行、EVM等更深层次的知识尚待挖掘。你了解随着区块链技术的进步,以太坊的这些基础元素将如何演变吗?本文旨在帮助你更好地理解以太坊的基本元素。欢迎留言交流,点赞并分享此文。
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
}