如何创建一个 Ethereum 钱包地址

如何创建一个 Ethereum 钱包地址

Bitcoin 和 Ethereum 的账户体系

Bitcoin 和 Ethereum 的账户体系是不同的思想,导致整个交易体系的结构有区别。因此他们对应地址会有不同。本次先略过 Bitcoin,仔细说明 Ethereum。

Bitcoin 采用的是 Unspent Transaction Output。

Ethereum 使用的就是比较容易理解的普通账户体系。

什么是区块链钱包地址

简单的说区块链本质上是一个账本,账本上记录着一条一条的转账记录。每一条转账记录的基本信息有三要素:

  1. 从哪
  2. 到哪
  3. 多少钱

在区块链的世界里面,钱包地址就是转账记录里面从这里转到那里的标识。

有了这个钱包地址,我们也就可以把这个地址所有交易记录找出来,相加后就能得到该地址的当前余额。

拥有这个钱包地址的操作权限(私钥)就是进入区块链世界的门票。

简单解释一个区块链钱包地址是如何得来的

不同于当下的互联网世界的账号体系,一个区块链的钱包地址并不是注册得来。 而是通过使用密钥进过一系列复杂的加密算法得来。
生成钱包地址的加密算法是公开且固定的。意味这任何人可以在任何时候用任何设备任何编程语言实现该方法后生成钱包地址。无需联网。
每一个符合条件的唯一密钥对应唯一一个钱包地址。
密钥是操作钱包的唯一凭证。
密钥丢失不可找回。

基于这些不太常见的情景,我举例几个有趣的例子。

  1. 我可以简单的获取成千上万的钱包地址,他们全部都是可以被操作的地址。只不过这些钱包地址里面没有任何的转账记录。
  2. 当向一个合法的钱包地址转账的时候,并不会也不需要校验这个地址是否可被操作。如果这个地址是一个错误地址,转账会成功,并且可查该钱包余额和记录。只是没有人拥有该钱包地址的私钥即钱包的操作权限。
  3. 理论上是存在这样的可能性,要是我不小心使用了一个密钥生成的地址是一个有余额的地址。那我就等于获得了该钱包地址的操作权限可以获取余额。
  4. 就算我有一个 1000 个 ETH 余额的钱包地址,但是我不小心把密钥丢了。那这 1000 个 ETH 就再也找不回了。

本文具有强烈的个人感情色彩,如有观看不适,请尽快关闭. 本文仅作为个人学习记录使用,也欢迎在许可协议范围内转载或使用,请尊重版权并且保留原文链接,谢谢您的理解合作. 如果您觉得本站对您能有帮助,您可以使用RSS方式订阅本站,这样您将能在第一时间获取本站信息.

Ethereum 钱包地址

Ethereum 有两种账号类型

  1. 外部账户(Externally-owned) - 由有这密钥的拥有者控制
  2. 合约账户(Contract) - 由部署在 Ethereum 里面的代码控制

两种账号都拥有

  • 接受,持有发送 ETH 和 tokens
  • 可以跟已经部署的智能合约交互

两种账号的地址格式:

  1. 外部账户(Externally-owned) : 表示的是该账户公钥经过 Keccak-256 哈希算法后的最后 20 字节再加上 0x 开头变为 42 个字符十六进制字符串。例如:0x5e97870f263700f46aa00d967821199b9bc5a120
  2. 合约账户(Contract): 由 0x 开头的 42 个字符十六进制字符串。例如:0x06012c8cf97bead5deae237070f9587f8e7a266d

Ethereum 钱包地址生成原理

私钥 -> 公钥 -> 地址。因此地址的生成需要三步:

  1. 生成一个随机的私钥(64 个 16 进制字符, (256 bits / 32 bytes))
  2. 通过 Elliptic Curve Digital Signature Algorithm 用私钥生成公钥(128 个 16 进制字符,64 bytes)
  3. 通过 Keccak-256 的哈希函数用公钥得到一个 64 个字符长度的字符串,然后取最后 40 个字符作为地址(40 个 16 进制字符,20 bytes)

命令行生成方式

先安装一下 sha3sum 获取 keccak-256sum
https://github.com/maandree/sha3sum

1
2
// on macOS
brew install sha3sum
1
2
3
4
5
6
7
8
9
10
# Generate the private and public keys
openssl ecparam -name secp256k1 -genkey -noout | openssl ec -text -noout > key
# Extract the public key and remove the EC prefix 0x04
cat key | grep pub -A 5 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^04//' > pub
# Extract the private key and remove the leading zero byte
cat key | grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^00//' > priv
# Generate the hash and take the address part
cat pub | keccak-256sum -x -l | tr -d ' -' | tail -c 41 | awk '{print "0x"$1}'> address
# display your address
cat address

Go 程序生成方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
"crypto/ecdsa"
"fmt"
"log"

"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto"
)

func main() {
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatal(err)
}

privateKeyBytes := crypto.FromECDSA(privateKey)
fmt.Println("SAVE BUT DO NOT SHARE THIS (Private Key):", hexutil.Encode(privateKeyBytes))

publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
}

publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
fmt.Println("Public Key:", hexutil.Encode(publicKeyBytes))

address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
fmt.Println("Address:", address)
}

至此,我们就有两种简单的办法可以离线生成了 Ethereum 的钱包地址,并且拥有密钥。
基于这个简单的原理,我们稍后可以简单的做一些有趣的小程序了。

Bitcoin 钱包地址

Bitcoin 目前有三种钱包地址类型:

  1. Legacy(P2PKH): P2PKH 是 Pay To PubKey Hash(付款至公钥哈希)的缩写。 原生的钱包地址类型,
    以数字 1 开头。
    例如:1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。
  2. Nested SegWit(P2SH): P2SH 是 Pay To Script Hash(支付至脚本哈希)的缩写 降低了每笔交易的数据大小。 该地址将部分交易数据和交易分隔,从而实现此目的。 降低交易大小后,单个比特币区块就可以容纳更多交易。
    以数字 3 开头。
    例如:3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy。
  3. Native SegWit(Bech32): 地址格式的最新进展。 它的效率比前身更高。 这意味着相比 SegWit 地址,它的交易速度更快、可扩展性更高,每笔交易费用也更低。 除此之外,bech32 的错误检测功能更强,并且字母为全小写,读取更加方便。
    以 bc1 开头,也称为”bc1 地址”。
    例如:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq。

Bitcoin 钱包地址生成原理

跟 Bitcoin 钱包地址相关的 BIP

  • BIP32 - Hierarchical Deterministic Wallets
  • BIP39 - Mnemonic code for generating deterministic keys
  • BIP43 - Purpose Field for Deterministic Wallets
  • BIP44 - Multi-Account Hierarchy for Deterministic Wallets
  • BIP49 - Derivation scheme for P2WPKH-nested-in-P2SH based accounts
  • BIP84 - Derivation scheme for P2WPKH based accounts
  • BIP173 - Base32 address format for native v0-16 witness outputs
  • SLIP44 - Registered coin types for BIP-0044

Referrals

Photo by Georgi Srebrev on Unsplash

什么是比特币地址&三种地址格式对比

Generate Ethereum Private key, Public key, and Address using Bash and OpenSSL

How to generate a new Ethereum address in Go

【Ethereum 基础】:账户、地址、私钥和公钥

從地址格式探討 Bitcoin 和 Ethereum 的差異

Author

Ewan Xiao

Posted on

July 27th 2022

Updated on

October 5th 2022

Licensed under

Comments