Go-ethereum 源碼解析之 go-ethereum/core/types.go

Go-ethereum 源碼解析之 go-ethereum/core/types.go


Source code

// Copyright 2017 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

package core

import (
    "github.com/ethereum/go-ethereum/core/state"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/core/vm"
)

// Validator is an interface which defines the standard for block validation. It
// is only responsible for validating block contents, as the header validation is
// done by the specific consensus engines.
//
type Validator interface {
    // ValidateBody validates the given block's content.
    ValidateBody(block *types.Block) error

    // ValidateState validates the given statedb and optionally the receipts and
    // gas used.
    ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error
}

// Processor is an interface for processing blocks using a given initial state.
//
// Process takes the block to be processed and the statedb upon which the
// initial state is based. It should return the receipts generated, amount
// of gas used in the process and return an error if any of the internal rules
// failed.
type Processor interface {
    Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error)
}


Appendix A. 總體批注

本文件定義了兩個接口。一個是用于驗證區(qū)塊的接口 Validator谣拣。另一個是用于處理區(qū)塊的接口 Processor募寨。需要注意,這些操作都需要用到狀態(tài)數(shù)據(jù)庫森缠。


Appendix B. 詳細批注

1. type Validator interface

接口 Validator 定義了區(qū)塊驗證的標準接口拔鹰。它只負責驗證區(qū)塊內(nèi)容,因為區(qū)塊頭驗證由特定的共識引擎完成贵涵。

(1) ValidateBody(block *types.Block) error

方法 ValidateBody() 驗證給定區(qū)塊的內(nèi)容列肢。

參數(shù):

  • block *types.Block: 給定區(qū)塊

返回值:

  • error: 錯誤消息或 nil

(2) ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error

方法 ValidateState() 驗證給定的狀態(tài)數(shù)據(jù)庫以及可選的交易回執(zhí)列表和使用的 Gas。

參數(shù):

  • block *types.Block: 區(qū)塊
  • parent *types.Block: 父區(qū)塊
  • state *state.StateDB: 狀態(tài)數(shù)據(jù)庫
  • receipts types.Receipts: 交易回執(zhí)列表
  • usedGas uint64: 已使用的 Gas

返回值:

  • error: 錯誤消息或 nil

2. type Processor interface

接口 Processor 使用一個給定的初始狀態(tài)數(shù)據(jù)庫處理區(qū)塊宾茂。

(1) Process(block *types.Block, statedb state.StateDB, cfg vm.Config) (types.Receipts, []types.Log, uint64, error)

方法 Process() 基于給定的初始狀態(tài)數(shù)據(jù)庫處理給定的區(qū)塊瓷马。它應(yīng)該返回生成的交易回執(zhí)列表,消耗的 Gas跨晴,如果任一內(nèi)部規(guī)則失敗返回錯誤欧聘。

參數(shù):

  • block *types.Block: 區(qū)塊
  • statedb *state.StateDB: 狀態(tài)數(shù)據(jù)庫
  • cfg vm.Config: EVM 配置信息

返回值:

  • types.Receipts: 交易回執(zhí)列表
  • []*types.Log: 日志列表
  • uint64: 消耗的 Gas
  • error: 錯誤消息或 nil

Reference

  1. https://github.com/ethereum/go-ethereum/blob/master/core/types.go

Contributor

  1. Windstamp, https://github.com/windstamp
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坟奥,隨后出現(xiàn)的幾起案子树瞭,更是在濱河造成了極大的恐慌拇厢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晒喷,死亡現(xiàn)場離奇詭異孝偎,居然都是意外死亡,警方通過查閱死者的電腦和手機凉敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門衣盾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爷抓,你說我怎么就攤上這事势决。” “怎么了蓝撇?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵果复,是天一觀的道長。 經(jīng)常有香客問我渤昌,道長虽抄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任独柑,我火速辦了婚禮迈窟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忌栅。我一直安慰自己车酣,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布索绪。 她就那樣靜靜地躺著湖员,像睡著了一般。 火紅的嫁衣襯著肌膚如雪者春。 梳的紋絲不亂的頭發(fā)上破衔,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音钱烟,去河邊找鬼晰筛。 笑死,一個胖子當著我的面吹牛拴袭,可吹牛的內(nèi)容都是我干的读第。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼拥刻,長吁一口氣:“原來是場噩夢啊……” “哼怜瞒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吴汪,失蹤者是張志新(化名)和其女友劉穎惠窄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漾橙,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡杆融,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霜运。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脾歇。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淘捡,靈堂內(nèi)的尸體忽然破棺而出藕各,到底是詐尸還是另有隱情,我是刑警寧澤焦除,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布激况,位于F島的核電站,受9級特大地震影響踢京,放射性物質(zhì)發(fā)生泄漏誉碴。R本人自食惡果不足惜宦棺,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一瓣距、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧代咸,春花似錦蹈丸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至思瘟,卻和暖如春荸百,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滨攻。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工够话, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人光绕。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓女嘲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诞帐。 傳聞我的和親對象是個殘疾皇子欣尼,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容