从命令行开始解析生成创世块源码

使用NodeJs、Express开发区块链 本篇文章主要讲述了,加密货币的一些特征,以及node.js的基础,服务启动如何与链进行交互,以及node.js在区块链技术领域的调查描述,并进行了案例示范,其次对源码进行解读。从架构设计的角度,层层剖析区块链的设计原理,深刻解读相关概念和技术。从项目设计的角度谋篇,从项目入口程序出发,介绍了本项目的整体结构,分别介绍了P2P网络、区块链、共识机制等区块链核心内容及其代码实现。 从本书来说,首先了解... 阅读详情

创建创世块的代码解析

在cmd的geth目录下的main.go中

init函数先于main函数执行,做命令的初始化,其中比较重要的有三个地方,app.Action=geth,app.Commands中consoleCommand,以及App.Before指向的匿名函数

func init() {
	// Initialize the CLI app and start Geth
	app.Action = geth
	app.HideVersion = true // we have a command to print the version
	app.Copyright = "Copyright 2013-2018 The go-ethereum Authors"
	app.Commands = []cli.Command{
		// See chaincmd.go:
		initCommand,
		importCommand,
		exportCommand,
		importPreimagesCommand,
		exportPreimagesCommand,
		copydbCommand,
		removedbCommand,
		dumpCommand,
		// See monitorcmd.go:
		monitorCommand,
		// See accountcmd.go:
		accountCommand,
		walletCommand,
		// See consolecmd.go:
		consoleCommand,
		attachCommand,
		javascriptCommand,
		// See misccmd.go:
		makecacheCommand,
		makedagCommand,
		versionCommand,
		bugCommand,
		licenseCommand,
		// See config.go
		dumpConfigCommand,
	}
	sort.Sort(cli.CommandsByName(app.Commands))

	app.Flags = append(app.Flags, nodeFlags...)
	app.Flags = append(app.Flags, rpcFlags...)
	app.Flags = append(app.Flags, consoleFlags...)
	app.Flags = append(app.Flags, debug.Flags...)
	app.Flags = append(app.Flags, whisperFlags...)

	app.Before = func(ctx *cli.Context) error {
		runtime.GOMAXPROCS(runtime.NumCPU())
		if err := debug.Setup(ctx); err != nil {
			return err
		}
		// Start system runtime metrics collection
		go metrics.CollectProcessMetrics(3 * time.Second)

		utils.SetupNetwork(ctx)
		return nil
	}

	app.After = func(ctx *cli.Context) error {
		debug.Exit()
		console.Stdin.Close() // Resets terminal mode.
		return nil
	}
}

main函数中的内容比较简单,这里不多做任何解释。

func main() {
	if err := app.Run(os.Args); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

通过gopkg.in/urfave/cli.v1包中的代码来衔接到cmd/geth/chaincmd包中的代码,APP包中中HandleAction函数action的类型是「func(*Context) error」,此时将执行a(context)方法,那么此时调用那个Action呢,就是我们前面提到的App.init()初始化命令时的initCommand,接下来我们来看看cmd/geth/chaincmd中的initCommand:

var (
	initCommand = cli.Command{
		Action:    utils.MigrateFlags(initGenesis),
		Name:      "init",
		Usage:     "Bootstrap and initialize a new genesis block",
		ArgsUsage: "<genesisPath>",
		Flags: []cli.Flag{
			utils.DataDirFlag,
			utils.LightModeFlag,
		},
		Category: "BLOCKCHAIN COMMANDS",
		Description: `
The init command initializes a new genesis block and definition for the network.
This is a destructive action and changes the network in which you will be
participating.

It expects the genesis file as argument.`,
	}	

这允许使用现有的配置功能。当所有标志被迁移时,该功能可以被删除,并且必须改变现有的配置功能,即使用本地标志

func MigrateFlags(action func(ctx *cli.Context) error) func(*cli.Context) error {
	return func(ctx *cli.Context) error {
		for _, name := range ctx.FlagNames() {
			if ctx.IsSet(name) {
				ctx.GlobalSet(name, ctx.String(name))
			}
		}
		return action(ctx)
	}
}

根据给定的JSon格式文件初始化创世块

func initGenesis(ctx *cli.Context) error {
	// Make sure we have a valid genesis JSON
	genesisPath := ctx.Args().First()
	if len(genesisPath) == 0 {
		utils.Fatalf("Must supply path to genesis JSON file")
	}
	file, err := os.Open(genesisPath)
	if err != nil {
		utils.Fatalf("Failed to read genesis file: %v", err)
	}
	defer file.Close()

	genesis := new(core.Genesis)
	if err := json.NewDecoder(file).Decode(genesis); err != nil {
		utils.Fatalf("invalid genesis file: %v", err)
	}
	// Open an initialise both full and light databases
	stack := makeFullNode(ctx)
	for _, name := range []string{"chaindata", "lightchaindata"} {
		chaindb, err := stack.OpenDatabase(name, 0, 0)
		if err != nil {
			utils.Fatalf("Failed to open database: %v", err)
		}
		_, hash, err := core.SetupGenesisBlock(chaindb, genesis)
		if err != nil {
			utils.Fatalf("Failed to write genesis block: %v", err)
		}
		log.Info("Successfully wrote genesis state", "database", name, "hash", hash)
	}
	return nil
}

将初始创世块存储

chaindb, err := stack.OpenDatabase(name, 0, 0)
		if err != nil {
			utils.Fatalf("Failed to open database: %v", err)
		}

涉及到的Core层次的代码

genesis := new(core.Genesis)

_, hash, err := core.SetupGenesisBlock(chaindb, genesis)
	if err != nil {
		utils.Fatalf("Failed to write genesis block: %v", err)
	}

创世块的数据结构

type Genesis struct {
	Config     *params.ChainConfig `json:"config"`
	Nonce      uint64              `json:"nonce"`
	Timestamp  uint64              `json:"timestamp"`
	ExtraData  []byte              `json:"extraData"`
	GasLimit   uint64              `json:"gasLimit"   gencodec:"required"`
	Difficulty *big.Int            `json:"difficulty" gencodec:"required"`
	Mixhash    common.Hash         `json:"mixHash"`
	Coinbase   common.Address      `json:"coinbase"`
	Alloc      GenesisAlloc        `json:"alloc"      gencodec:"required"`

	// These fields are used for consensus tests. Please don't use them
	// in actual genesis blocks.
	Number     uint64      `json:"number"`
	GasUsed    uint64      `json:"gasUsed"`
	ParentHash common.Hash `json:"parentHash"`
}

检查创世块的相关处理逻辑,符合逻辑写创世块,或者反馈控制台相应的问题

func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {
	if genesis != nil && genesis.Config == nil {
		return params.AllProtocolChanges, common.Hash{}, errGenesisNoConfig
	}

	// Just commit the new block if there is no stored genesis block.
	stored := GetCanonicalHash(db, 0) //获取genesis对应的区块
	if (stored == common.Hash{}) { //如果没有区块 最开始启动geth会进入这里。
		if genesis == nil { 
			//如果genesis是nil 而且stored也是nil 那么使用主网络
			// 如果是test  dev  rinkeby 那么genesis不为空 会设置为各自的genesis
			log.Info("Writing default main-net genesis block")
			genesis = DefaultGenesisBlock()
		} else { // 否则使用配置的区块
			log.Info("Writing custom genesis block")
		}
		// 写入数据库
		block, err := genesis.Commit(db)
		return genesis.Config, block.Hash(), err
	}

	// Check whether the genesis block is already written.
	if genesis != nil { //如果genesis存在而且区块也存在 那么对比这两个区块是否相同
		block, _ := genesis.ToBlock()
		hash := block.Hash()
		if hash != stored {
			return genesis.Config, block.Hash(), &GenesisMismatchError{stored, hash}
		}
	}

	// Get the existing chain configuration.
	// 获取当前存在的区块链的genesis配置
	newcfg := genesis.configOrDefault(stored)
	// 获取当前的区块链的配置
	storedcfg, err := GetChainConfig(db, stored)
	if err != nil {
		if err == ErrChainConfigNotFound {
			// This case happens if a genesis write was interrupted.
			log.Warn("Found genesis block without chain config")
			err = WriteChainConfig(db, stored, newcfg)
		}
		return newcfg, stored, err
	}
	// Special case: don't change the existing config of a non-mainnet chain if no new
	// config is supplied. These chains would get AllProtocolChanges (and a compat error)
	// if we just continued here.
	// 特殊情况:如果没有提供新的配置,请不要更改非主网链的现有配置。 
	// 如果我们继续这里,这些链会得到AllProtocolChanges(和compat错误)。
	if genesis == nil && stored != params.MainnetGenesisHash {
		return storedcfg, stored, nil   // 如果是私有链接会从这里退出。
	}

	// Check config compatibility and write the config. Compatibility errors
	// are returned to the caller unless we're already at block zero.
	// 检查配置的兼容性,除非我们在区块0,否则返回兼容性错误.
	height := GetBlockNumber(db, GetHeadHeaderHash(db))
	if height == missingNumber {
		return newcfg, stored, fmt.Errorf("missing block number for head header hash")
	}
	compatErr := storedcfg.CheckCompatible(newcfg, height)
	// 如果区块已经写入数据了,那么就不能更改genesis配置了
	if compatErr != nil && height != 0 && compatErr.RewindTo != 0 {
		return newcfg, stored, compatErr
	}
	// 如果是主网络会从这里退出。
	return newcfg, stored, WriteChainConfig(db, stored, newcfg)
}

ToBlock, 这个方法使用genesis的数据,使用基于内存的数据库,然后创建了一个block并返回。

// ToBlock creates the block and state of a genesis specification.
func (g *Genesis) ToBlock() (*types.Block, *state.StateDB) {
	db, _ := ethdb.NewMemDatabase()
	statedb, _ := state.New(common.Hash{}, state.NewDatabase(db))
	for addr, account := range g.Alloc {
		statedb.AddBalance(addr, account.Balance)
		statedb.SetCode(addr, account.Code)
		statedb.SetNonce(addr, account.Nonce)
		for key, value := range account.Storage {
			statedb.SetState(addr, key, value)
		}
	}
	root := statedb.IntermediateRoot(false)
	head := &types.Header{
		Number:     new(big.Int).SetUint64(g.Number),
		Nonce:      types.EncodeNonce(g.Nonce),
		Time:       new(big.Int).SetUint64(g.Timestamp),
		ParentHash: g.ParentHash,
		Extra:      g.ExtraData,
		GasLimit:   new(big.Int).SetUint64(g.GasLimit),
		GasUsed:    new(big.Int).SetUint64(g.GasUsed),
		Difficulty: g.Difficulty,
		MixDigest:  g.Mixhash,
		Coinbase:   g.Coinbase,
		Root:       root,
	}
	if g.GasLimit == 0 {
		head.GasLimit = params.GenesisGasLimit
	}
	if g.Difficulty == nil {
		head.Difficulty = params.GenesisDifficulty
	}
	return types.NewBlock(head, nil, nil, nil), statedb
}

Commit方法和MustCommit方法, Commit方法把给定的genesis的block和state写入数据库, 这个block被认为是规范的区块链头。

// Commit writes the block and state of a genesis specification to the database.
// The block is committed as the canonical head block.
func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) {
	block, statedb := g.ToBlock()
	if block.Number().Sign() != 0 {
		return nil, fmt.Errorf("can't commit genesis block with number > 0")
	}
	if _, err := statedb.CommitTo(db, false); err != nil {
		return nil, fmt.Errorf("cannot write state: %v", err)
	}
	// 写入总难度
	if err := WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty); err != nil {
		return nil, err
	}
	// 写入区块
	if err := WriteBlock(db, block); err != nil {
		return nil, err
	}
	// 写入区块收据
	if err := WriteBlockReceipts(db, block.Hash(), block.NumberU64(), nil); err != nil {
		return nil, err
	}
	// 写入   headerPrefix + num (uint64 big endian) + numSuffix -> hash
	if err := WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil {
		return nil, err
	}
	// 写入  "LastBlock" -> hash
	if err := WriteHeadBlockHash(db, block.Hash()); err != nil {
		return nil, err
	}
	// 写入 "LastHeader" -> hash
	if err := WriteHeadHeaderHash(db, block.Hash()); err != nil {
		return nil, err
	}
	config := g.Config
	if config == nil {
		config = params.AllProtocolChanges
	}
	// 写入 ethereum-config-hash -> config
	return block, WriteChainConfig(db, block.Hash(), config)
}

// MustCommit writes the genesis block and state to db, panicking on error.
// The block is committed as the canonical head block.
func (g *Genesis) MustCommit(db ethdb.Database) *types.Block {
	block, err := g.Commit(db)
	if err != nil {
		panic(err)
	}
	return block
}

返回各种模式的默认Genesis

// DefaultGenesisBlock returns the Ethereum main net genesis block.
func DefaultGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.MainnetChainConfig,
		Nonce:      66,
		ExtraData:  hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"),
		GasLimit:   5000,
		Difficulty: big.NewInt(17179869184),
		Alloc:      decodePrealloc(mainnetAllocData),
	}
}

// DefaultTestnetGenesisBlock returns the Ropsten network genesis block.
func DefaultTestnetGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.TestnetChainConfig,
		Nonce:      66,
		ExtraData:  hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"),
		GasLimit:   16777216,
		Difficulty: big.NewInt(1048576),
		Alloc:      decodePrealloc(testnetAllocData),
	}
}

// DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block.
func DefaultRinkebyGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.RinkebyChainConfig,
		Timestamp:  1492009146,
		ExtraData:  hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
		GasLimit:   4700000,
		Difficulty: big.NewInt(1),
		Alloc:      decodePrealloc(rinkebyAllocData),
	}
}

// DevGenesisBlock returns the 'geth --dev' genesis block.
func DevGenesisBlock() *Genesis {
	return &Genesis{
		Config:     params.AllProtocolChanges,
		Nonce:      42,
		GasLimit:   4712388,
		Difficulty: big.NewInt(131072),
		Alloc:      decodePrealloc(devAllocData),
	}
}

GitHub地址:

https://github.com/guoshijiang/go-ethereum-code-analysis
关注问我技术公众号,加小问,拉您入技术交流群:
在这里插入图片描述

geth配置中,genesis.json的几个问题 现有网上流传的绝大部分 genesis.json,不适用于geth v1.6 版本。有些会导致初始化失败,有些看似初始化成功,但是后续会出各种莫名其妙的问题。本文给出genesis.json的正确配置。 阅读详情

相关推荐

创世记

创世记

解决geth配置时遇到问题 Fatal: Failed to read genesis file: open genesis.json: permission denied

Fatal: failed to write genesis block: genesis has no chain configuration :这个错误信息,就是说,你的json文件中,缺少config部分。Fatal: invalid genesis file: hex string has odd length: 从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。这个问题应为,所查看的教程中并没有前置的客户端节点配置命令。猜测是geth版本问题,尝试更新。

m0_73379721的博客 1509

ENVI+SARscape实战:从哨兵一号数据到地震形变制图全流程解析

本文详细解析了使用ENVI和SARscape软件从哨兵一号数据生成地震形变图的全流程,包括数据获取、干涉处理、相位解缠等关键步骤。通过实战技巧和参数设置建议,帮助用户高效处理SAR数据,提升地震形变监测的精度和可视化效果。

weixin_30460489的博客 385

geth的安装和使用

windows下安装Geth 1.下载地址: https://geth.ethereum.org/downloads/ 下载windows版 2.按指示安装 3.在cmd下进入安装路径,输入geth help查看是否安装成功 出现下面情况表示安装成功。 配置和使用 搭建私有网络 1.配置genesis.json文件 在geth安装目录下配置一份genesis.json文件 { "config": { "chainId": 10,

weixin_43946212的博客 4938

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

银河麒麟系统安装redis【亲测可行】

架构:Linux 5.10.0-9-generic x86_64 GNU/Linux。redis版本:redis-6.2.3.tar.gz。然后在执行make install,结束;OS:银河麒麟V10(SP1)未激活。cpu:I5-10代;

lx_nhs的博客 3335

什么叫创世区块、创世区块有什么用、为什么需要创世区块

创世区块(Genesis Block)是任何区块链技术中的第一个区块,它是区块链的起点,标志着该区块链的诞生。在创世区块之前没有任何区块存在,因此它没有前一个区块的哈希值,通常这个位置会被设置为零或者一个预定义的特殊值。创世区块包含了区块链网络的一些初始参数和规则,比如初始的难度值、时间戳、初始的交易记录等。

以择人之心择己,以恕己之心恕人。 1557

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3450

以太坊源码分析(4)——初始化创世区块

一、前言 通过前面章节学习了以太坊的基本架构之后,我们通过自己搭建一个单节点,并覆盖以太坊主要流程来讲解代码。在这一节,你将学会:如何初始化创世区块 二、准备工作 以太坊源码 V 1.8.0 golang 1.9+ windows 系统下 goland 2018+ 因为本系列文章主要是研究以太坊源码,所以以太坊的编译工作不详细展开,有需要的可以参考这篇文章。 三、genesis.j...

极地大王章的专栏 1800

S4 codingblock增加客户化字段的一些小问题

今天使用codingblock增加了两个客户化字段后(S4版本),查看常用的几个表 ACDOCA BSEG 等等两个客户化字段安静的出现在表内,以为没有问题了 。结果后来MM那边查看物料凭证时程序直接dump,后来开发查明原因居然是因为财务增加的这两个增强字段的原因。 报错如下图所示: 主要是因为增加了字段后,更新了后台表,但是没有自动更新到视图。就是MSEG表增加了这两个字段,但是呢他对应的视图NSDM_V_MSEG没有增加,导致两边的结构不一致。 所以要解决这个问题,只能在视图NSDM_V_MSEG增

m0_46145967的博客 3919

解决 `version ‘GLIBCXX_3.4.32‘ not found‘ not found` 错误

解决 `version 'GLIBCXX_3.4.32' not found' not found` 错误

engchina的专栏 5677

tinychain源码解读:从创世区块到链上交易的完整流程

**tinychain**是一个极简的比特币实现,用不到700行Python代码完整再现了比特币的核心机制。本文将从**创世区块**开始,深入解析**区块链交易**的完整生命周期,带你理解这个**迷你比特币**如何实现**去中心化账本**的核心功能。无论你是区块链新手还是开发者,都能通过这个简化版本快速掌握比特币的工作原理。 ## 🔍 tinychain项目概览 tinychain是一个**

gitblog_00336的博客 330

FR4板材实战:用ADS 2023快速设计微带线低通滤波器(附Line-Cal计算技巧)

本文详细介绍了使用ADS 2023在FR4板材上设计1-3GHz微带线低通滤波器的工程技巧。通过Line-Cal工具快速计算微带线参数,解决FR4板材的介质损耗和阻抗匹配问题,提供从集总参数转换到分布参数的实用方法,并分享版图设计与实测验证的关键要点,帮助工程师高效完成射频滤波器设计。

omega的博客 713

如何快速开始使用Prysm:新手入门教程

Prysm是以太坊权益证明(PoS)协议的Go语言实现,为开发者和用户提供了参与以太坊网络验证的完整解决方案。本教程将帮助你快速搭建Prysm环境,从安装到启动验证节点,轻松开启以太坊PoS之旅。 ## 🔍 准备工作:系统要求与依赖 在开始前,请确保你的系统满足以下条件: - 64位Linux、macOS或Windows操作系统 - 至少8GB内存和20GB可用磁盘空间 - 稳定的网络连接

gitblog_00931的博客 471

Smart PLC高速脉冲输入计米轮模块(编码器测速/计米详细讲解)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接:线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-优快云博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-优快云博客_plc闭环控制实例。SMART PLC时间间隔定时器应用(高速脉冲测频/测速)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2819

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

区块链开发(一)搭建基于以太坊go-ethereum的私有链环境

通过各方资料了解学习之后,决定自己开始搭建基于以太坊go-ethereum的私有链环境。由于本人的电脑系统为win8,为避免window环境出现过多莫名其妙的问题,特意通过vm搭建了一台ubuntu16.04版本的虚拟系统。以下内容均基于ubuntu16.04系统。go-ethereum客户端下载地址&参考手册首先,可以查看一下go-ethereum项目在git上的地址: https://gith

程序新视界 3万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Fabric1.4源码解析:Peer节点加入通道

又开始新的阅读了,这次看的是Peer节点加入通道的过程。其实每次看源码都会有好多没有看懂的地方,不过相信只要坚持下去,保持记录,还是有很多收获的。 对于Peer节点加入通道这一过程,从用户角度来说也只是简单执行一行命令: peer channel join -b mychannel.block 就完成了某一节点加入通道的过程。而从Fabric网络内部来讲,却是...

weixin_30768661的博客 891

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

go-ethereum(通常简称为 Geth)源码解释

go-ethereum 是一个工程杰作,代码质量很高,但体量巨大。分层思想:它清晰地分离了核心协议 (core)、网络通信 (p2p) 和应用服务 (rpc, eth)。模块化设计:每个部分都相对独立,通过接口(如 consensus.Engine)进行交互,具有很好的扩展性。数据结构是基础:不理解 Block、Transaction 和 Merkle Patricia Trie,就很难理解上层逻辑。希望这个导览能为你探索 Geth 的代码世界提供一张清晰的地图!

u011091936的博客 791

从零构建多节点以太坊私链:基于Geth与Clique PoA的实战指南

区块链网络的核心在于其去中心化与共识机制,它通过分布式节点共同维护一个不可篡改的账本。在以太坊生态中,Geth客户端是实现这一原理的关键工具,它完整实现了以太坊协议,允许开发者构建独立的网络环境。对于开发测试、教学演示或联盟链概念验证而言,搭建一个隔离的私有网络具有极高的技术价值,它能模拟真实的节点发现、交易广播与区块同步行为。本指南聚焦于使用Geth和Clique权威证明共识,详细讲解如何从创世区块配置入手,逐步完成多节点组网、互连与稳定运行,并深入解析节点无法互相发现、区块高度不一致等常见问题的解决方案

weixin_34290631的博客 722

区块链初探

区块链报告 0. 实验环境 虚拟机: ubuntu-17.10.1-desktop-amd64 go的版本: go1.11 1. 以太坊的安装,安装geth客户端 geth是用go语言写的,编译geth源码需要go语言和C语言编译器,因此需要先安装go语言,go语言版本推荐用go1.7及以上,go语言的安装配置教程。 将github仓库克隆源文件: git clone https:/...

lllllyt的博客 1979

在 python-sdk 中为 MCP 客户端接入 OAuth 2.0:OAuthClientProvider 与客户端凭据认证实战

本指南围绕官方 Python SDK(python-sdk)的 OAuth 客户端侧能力展开,讲解如何用 `OAuthClientProvider` 为受保护的 MCP Server 自动完成授权码(Authorization Code + PKCE)流程,以及用 `ClientCredentialsOAuthProvider` / `PrivateKeyJWTOAuthProvider` 实现机

gitblog_00080的博客 351

Android ServiceManager启动源码解析:Binder通信总机与系统服务注册机制

在Android系统架构中,进程间通信(IPC)是支撑系统服务与应用交互的核心机制。Binder作为Android特有的IPC框架,通过驱动层的内核模块实现高效的数据传输与进程隔离。其核心原理在于利用内存映射与引用计数机制,在保证安全性的同时实现跨进程方法调用。这一技术价值在于构建了Android系统服务的松耦合架构,使得ActivityManager、WindowManager等核心服务能够独立运行并协同工作。在应用场景中,任何系统服务的注册与发现都依赖于一个中央协调组件。ServiceManager正是

weixin_30411819的博客 456

Ubuntu 16.04源码构建Go语言工具链实战指南

Go语言工具链是现代云原生开发的基础设施,其构建原理涉及自举(bootstrapping)、交叉编译与工具链隔离等核心编译器工程概念。理解Go如何从C实现的Go 1.4启动器出发,逐步构建出纯Go实现的高版本编译器,对保障遗留系统兼容性、定制化运行时及安全合规交付具有关键价值。尤其在Ubuntu 16.04等长期支持但内核与工具链陈旧的环境中,官方二进制常因binutils版本、libc ABI或调度器内核依赖不匹配而失效。本文聚焦源码构建这一可审计、可复现的工程实践,覆盖bootstrap编译器准备、GO

weixin_30653023的博客 370

Hyperledger Fabric联盟链部署运维实战:从国赛真题到生产级搭建

区块链作为分布式账本技术的核心,通过去中心化、不可篡改和共识机制等原理,为数据可信协作提供了底层支撑。其技术价值在于构建无需中介的信任体系,在供应链金融、政务数据共享等场景实现安全透明的业务流程。企业级应用中,联盟链架构成为主流,而部署运维是保障区块链网络稳定运行的关键工程实践。本文聚焦Hyperledger Fabric这一主流联盟链平台,深入解析基于Docker Compose的容器化部署方案,涵盖证书体系、通道配置、链码生命周期等核心模块。针对运维中常见的节点启动失败、链码部署异常等高频故障,提供结合

weixin_34133829的博客 406

svn可视化工具_版本控制可视化神器Gource:简单易上手,效果恰似烟花秀

鱼羊 发自 凹非寺量子位 报道 | 公众号 QbitAI如此华丽的绽放,莫非是一场动画烟火秀?非也,这其实是GitLab社区版的进化史,7年间82000次commit,尽皆在2.5分钟的视频内展现。Python的演化历史更是鹅妹子嘤。一开始,Guido化身一个白色的小人,满屏幕风风火火地释放“光束”,让“Python树”迅速长成了茁壮发育的模样。而从92年开始,新的角色出现在了Python的成长史...

weixin_39625975的博客 354

效果酷炫!开源可视化神器:带你看尽项目的沧桑变化!

公众号关注“GitHubDaily”设为 “星标”,每天带你逛 GitHub!转自量子位,作者鱼羊如此华丽的绽放,莫非是一场动画烟火秀?非也,这其实是 GitLab 社区版的进化史,7...

GitHubDaily 840
上一篇: 从命令行开始解析同步区块的代码
下一篇: Geth代码目录详解
The_Web3_社区
博客等级 码龄10年 388粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值