从命令行开始解析以太坊新建账户过程(geth account new命令)

以太坊编程-Geth Geth安装 阅读详情

从命令行开始解析以太坊新建账户过程(geth account new命令)

account

如上图是生成一个账户的过程,最后的账户表现为一个地址那么,这个过程的代码是怎么实现的呢,接下来我们从main函数命令行开始解析这个过程的代码。

在cmd/geth/main.go中的init函数中,有一个accountCommand的命令行参数

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
  }
}

账户相关的命令在cmd/geth/accountcmd.go里,新建账户命令为new,其会调accountCreate方法,我们继续看:

accountCommand = cli.Command{
	Name:     "account",
	Usage:    "Manage accounts",
	Category: "ACCOUNT COMMANDS",  

子命令:

{
        Name:   "new",
        Usage:  "Create a new account",
        Action: utils.MigrateFlags(accountCreate),
        Flags: []cli.Flag{
          utils.DataDirFlag,
          utils.KeyStoreDirFlag,
          utils.PasswordFileFlag,
          utils.LightKDFFlag,
        },
        Description: `
    geth account new

Creates a new account and prints the address.

The account is saved in encrypted format, you are prompted for a passphrase.

You must remember this passphrase to unlock your account in the future.

For non-interactive use the passphrase can be specified with the --password flag:

Note, this is meant to be used for testing only, it is a bad idea to save your
password to file or expose in any other way.
`,
      }

账户相关的命令在cmd/geth/accountcmd.go里,新建账户命令为new,其会调accountCreate方法,accountCreate在CLI标志定义的密钥库中创建一个新帐户

func accountCreate(ctx *cli.Context) error {
  cfg := gethConfig{Node: defaultNodeConfig()}
  // Load config file.
  if file := ctx.GlobalString(configFileFlag.Name); file != "" {
    if err := loadConfig(file, &cfg); err != nil {
      utils.Fatalf("%v", err)
    }
  }
  utils.SetNodeConfig(ctx, &cfg.Node)
  scryptN, scryptP, keydir, err := cfg.Node.AccountConfig()

  if err != nil {
    utils.Fatalf("Failed to read configuration: %v", err)
  }

  password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx))

  address, err := keystore.StoreKey(keydir, password, scryptN, scryptP)

  if err != nil {
    utils.Fatalf("Failed to create account: %v", err)
  }
  fmt.Printf("Address: {%x}\n", address)
  return nil
}

获取配置并解析用户的密码, StoreKey生成一个密钥,用’auth’加密并存储在给定的目录中

func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) {
  _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, crand.Reader, auth)
  return a.Address, err
}

storeNewKey()来创建一个新的账户,具体表现为生成一对公私钥,再由私钥算出地址并构建一个自定义的Key

func storeNewKey(ks keyStore, rand io.Reader, auth string) (*Key, accounts.Account, error) {
  key, err := newKey(rand)
  if err != nil {
    return nil, accounts.Account{}, err
  }
  a := accounts.Account{Address: key.Address, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}}
  if err := ks.StoreKey(a.URL.Path, key, auth); err != nil {
    zeroKey(key.PrivateKey)
    return nil, a, err
  }
  return key, a, err
}

Key的生成函数,通过椭圆曲线加密生成的私钥,生成Key

func newKey(rand io.Reader) (*Key, error) {
  privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand)
  if err != nil {
    return nil, err
  }
  return newKeyFromECDSA(privateKeyECDSA), nil
}

生成公钥和私钥对,ecdsa.GenerateKey(crypto.S256(), rand) 以太坊采用了椭圆曲线数字签名算法(ECDSA)生成一对公私钥,并选择的是secp256k1曲线

func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {
  k, err := randFieldElement(c, rand)
  if err != nil {
    return nil, err
  }

  priv := new(PrivateKey)
  priv.PublicKey.Curve = c
  priv.D = k
  priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())
  return priv, nil
}

以太坊使用私钥通过 ECDSA算法推导出公钥,继而经过 Keccak-256 单向散列函数推导出地址

func newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey) *Key {           
  id := uuid.NewRandom()                                               
  key := &Key{                                                         
    Id:         id,                                                  
    Address:    crypto.PubkeyToAddress(privateKeyECDSA.PublicKey),   
    PrivateKey: privateKeyECDSA,                                     
  }                                                                    
  return key                                                           
}                                                                        

func PubkeyToAddress(p ecdsa.PublicKey) common.Address {
  pubBytes := FromECDSAPub(&p)
  return common.BytesToAddress(Keccak256(pubBytes[1:])[12:])
}

地址代表以太坊帐户的20字节地址

const (
  HashLength    = 32
  AddressLength = 20
)

type Address [AddressLength]byte

func BytesToAddress(b []byte) Address {
  var a Address
  a.SetBytes(b)
  return a
}
func BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) }
func HexToAddress(s string) Address   { return BytesToAddress(FromHex(s)) }

总结,整个过程如下:

  • 创建随机私钥 (64 位 16 进制字符 / 32 字节)
  • 从私钥推导出公钥 (128 位 16 进制字符 / 64 字节)
  • 从公钥推导出地址 (40 位 16 进制字符 / 20 字节)

GitHub地址:

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

geth账户管理转账 参考http://blog.youkuaiyun.com/CHENYUFENG1991/article/details/53458175?locationNum=7&fps=1进入geth geth –identity “newEth” –rpc –rpccorsdomain “*” –datadir “./cdata” –port 30303 –rpcapi “db, eth,net,web3” –net 阅读详情

相关推荐

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 667

geth new account php,从命令行开始解析以太坊新建账户过程(geth account new命令)

从命令行开始解析以太坊新建账户过程(geth account new命令)如上图是生成一个账户的过程,最后的账户表现为一个地址那么,这个过程的代码是怎么实现的呢,接下来我们从main函数命令行开始解析这个过程的代码。在cmd/geth/main.go中的init函数中,有一个accountCommand的命令行参数func init() {// Initialize the CLI app and...

weixin_36301639的博客 497

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

geth new account php,geth账户管理指南

使用geth的account命令管理账户:geth account [options...] [arguments...]命令 - commandlist 列表显示现有账户new 创建一个新的账户update 修改账户import 导入私钥创建新账户可以使用--help获取这些命令的帮助信息,例如:~$ geth account list --helplist [command...

weixin_36219894的博客 396

别再只用LSTM了!用Temporal Fusion Transformer (TFT) 搞定多变量时序预测,附PyTorch实战代码

本文介绍了Temporal Fusion Transformer (TFT) 在多变量时序预测中的优势,并提供了PyTorch实战代码。TFT通过三重注意力机制解决了LSTM在特征交互、静态特征处理和解释性方面的不足,显著提升了预测精度和可解释性。文章详细讲解了TFT的核心组件构建、数据预处理、模型训练技巧及可解释性分析,帮助开发者快速掌握这一先进时序预测技术。

weixin_33712987的博客 279

解密OpenVLA的ActionTokenizer:如何用256个Token控制7维机器人动作

本文深入解析了OpenVLA模型中ActionTokenizer的核心机制。该分词器通过将7维连续机器人动作空间离散化为256个Token,巧妙地解决了大语言模型输出精确控制指令的难题。文章详细阐述了其设计哲学、与Llama-2词表的集成方式,并分析了256个离散区间在精度与效率间的平衡,为机器人视觉-语言-动作控制提供了关键技术桥梁。

weixin_29209801的博客 477

geth常见报错:personal已经弃用

如下:geth --datadir node1 --networkid 1008 --rpc.enabledeprecatedpersonal --nodiscover console 2>1.log。大体意思就是personal这个namespace已经不用了,如果再想用的话,需要通过。新geth版本中已经弃用personal对象。

fdbright的博客 1298

二维紧束缚模型求解程序

假如我们已经推导出了二维紧束缚模型的哈密顿量矩阵H(kx,ky)的解析形式,那么在整个布里渊区对角化矩阵就可以得到能带。从技术上说这里面有以下几个问题。 1. 缺少实空间和倒空间的坐标,使得能带难以和布里渊区高对称点对应。 2. 最容易处理的布里渊区是矩形,对于其他多边形,如果全布里渊区mesh画费米面有一定技术困难。 因此一个好的处理框架是首先给出实空间原子坐标,给出实空间哈密顿量,...

wwxy1995的博客 4083

以太坊开发--使用geth搭建私有链

我在上一篇博客中《以太坊开发--geth的使用入门》中使用的是geth的开发环境,准确来说和私链还是不同的。今天我们就学习来搭建一个以太坊私链。我们知道区块链有三种:公有链、联盟链、私有链。我会在之后的博客中详细讲述这三者的不同,今天主要来实现建立私有链的步骤。兑换geth环境和其他区块链环境的配置请参考《区块链-以太坊开发环境搭建介绍》这篇博客。(1)首先在命令行中使用“geth account

乞力马扎罗的雪CYF的博客 1万+

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 170

Altium Designer(AD)仿真实验操作指南

1:运行仿真2:设置仿真3:放置电源模块4:放置器件模块5:探针。

XU157303764的博客 8899

geth如何解锁账户?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34120274的博客 3032

【SpringBoot】1、创建第一个SpringBoot项目

创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。 首先,打开我们的Idea开发工具 选择Create New Poject(创建一个新的项目) ...

JACKAL 21万+

geth 新建账户

使用geth的account命令管理账户,例如创建新账户、更新账户密码、查询账户等: geth account <command> [options...] [arguments...] 命令 - command list 列表显示现有账户 new 创建一个新的账户 update 修改账...

weixin_30832351的博客 988

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

区块链系列教程——geth命令详解

本文是区块链系列的第二篇,上一篇区块链系列教程——创建属于自己的区块链大概介绍了区块链的基本内容,并且使用geth客户端创建了私链,给了各位读者较为直观的感受。本文简单介绍geth命令,这对后面的教程来说是一个基础。 geth用法简介 在安装有geth的环境下,使用命令即可查看geth的所有操作参数: geth -help 其用法为: geth [options] command [comm...

程序员Sunny的博客 3720

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

geth new account php,以太坊geth web3j personalNewAccount返回null

在通过web3j依赖包提供的api调用personalNewAccount方法返回null,也就是说并没有真正生成地址。这是什么原因导致的呢?如下代码调用:String password = EthereumConfiguration.getWalletPwd();NewAccountIdentifier newAccountIdentifier;try {newAccountIdentifier...

weixin_35991051的博客 666

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

以太坊教程

Geth 还负责重新执行到达新区块的交易,以确保它们有效,执行交易是在 Geth 的嵌入式计算机上完成的,称为以太坊虚拟机 (EVM)。共识客户端处理使节点能够与以太坊网络保持同步的所有逻辑,有自己的点对点网络,与将执行客户端相互连接的网络分开。是共识客户端的可选附加组件,比如POS共识机制,如果已将 32 个 ETH 发送到存款合约,则可以将验证者添加到共识客户端,进行出块与验证。注意extradata的最高的256位为0,如果是16进制表示,就是最前面64个数字是0。

m0_55078771的博客 999

RxJS 4 `Rx.config` 全局配置指南:自定义 Promise 实现与事件绑定策略

`Rx.config` 是 RxJS 4(Reactive Extensions for JavaScript)提供的全局配置对象,用于在不修改源码的前提下调整库的核心行为。本文以仓库文档 [doc/api/config/readme.md](https://link.gitcode.com/i/a9c5d2c87bad7e10f5d24cd0ab471069) 为主线,结合 [src/core/

gitblog_01032的博客 1126

以太坊系列之账户管理

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!! 账户 以太坊有两种账户类型: 外部账户(EOA) 合约账户 所有账户的状态代表以太坊网络的状态,以太坊网络会和每一个区块一起更新,网络需要达成关于以太坊的共识。账户代表外部代理人的身份,账户运用非对称加密的私钥来签署交易,以便以太坊虚拟机可以安全验证交易发送者的身份。 钥匙文件(Keyfiles) 每个账户都由...

weixin_44172023的博客 1028

如何从零构建以太坊账户系统:Geth私钥生成与地址计算实战

以太坊账户系统是区块链交互的基础,本文将带你快速掌握以太坊账户的核心原理,包括私钥生成、公钥提取和地址计算的完整流程。通过Geth源码解析和实战示例,即使是区块链新手也能轻松理解账户安全的底层逻辑。 ## 以太坊账户的核心构成 以太坊账户分为外部账户(EOA)和合约账户两种类型,其中外部账户由用户直接控制,通过私钥进行交易签名。每个账户都拥有唯一的20字节地址,类似于银行账户的账号,而私钥则相

gitblog_01092的博客 375

使用geth搭建以太坊私链详细步骤

摘要使用geth客户端搭建以太坊私链,创始区块配置,以分配初始以太币,启动geth参数。 使用geth客户端搭建私链,操作过程如下。 1.生成账户 geth account new geth account new 输入密码 生成...

Harry Wong的博客 740

truffle 的geth

进入geth以后创建新的账户参考http://blog.youkuaiyun.com/CHENYUFENG1991/article/details/53458175?locationNum=7&fps=1eth.accounts [] eth.accounts [“0x9a647332df73cf582fce51ac2b2551d110218040”] personal.ne

DDFFR的博客 1483

dqkg的命令用法_以太坊客户端Geth命令用法-参数详解

Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。如果你还不知道geth是什么,请先阅读入门篇:以太坊是什么。以下开始正文。命令用法geth [选项] 命令 [命令选项] [参数…]版本:1.7.3-...

weixin_39994665的博客 143

以太坊geth新版本error:account unlock with HTTP access is forbidden

使用最新版本geth客户,当执行personal.unlockAccount()或在程序中调用personal_unlockAccount接口时,会出现:account unlock with HTTP access is forbidden异常。 异常原因 新版本geth,出于安全考虑,默认禁止了HTTP通道解锁账户,相关issue:https://github.com/ethereum/go-...

程序新视界 1万+

geth账户管理指南

使用geth的account命令管理账户: geth account <command> [options...] [arguments...] 命令 - command list 列表显示现有账户 new 创建一个新的账户 update 修改账户 import 导入私钥创建新账户 可以使用--help获取这...

weixin_34402408的博客 1512
上一篇: cmd中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、付费专栏及课程。

余额充值