Bitcoin 和 Ethereum 的账户体系是不同的思想,导致整个交易体系的结构有区别。因此他们对应地址会有不同。本次先略过 Bitcoin,仔细说明 Ethereum。
Bitcoin 采用的是 Unspent Transaction Output。
Ethereum 使用的就是比较容易理解的普通账户体系。
简单的说区块链本质上是一个账本,账本上记录着一条一条的转账记录。每一条转账记录的基本信息有三要素:
在区块链的世界里面,钱包地址就是转账记录里面从这里转到那里的标识。
有了这个钱包地址,我们也就可以把这个地址所有交易记录找出来,相加后就能得到该地址的当前余额。
拥有这个钱包地址的操作权限(私钥)就是进入区块链世界的门票。
不同于当下的互联网世界的账号体系,一个区块链的钱包地址并不是注册得来。 而是通过使用密钥进过一系列复杂的加密算法得来。
生成钱包地址的加密算法是公开且固定的。意味这任何人可以在任何时候用任何设备任何编程语言实现该方法后生成钱包地址。无需联网。
每一个符合条件的唯一密钥对应唯一一个钱包地址。
密钥是操作钱包的唯一凭证。
密钥丢失不可找回。
基于这些不太常见的情景,我举例几个有趣的例子。
Ethereum 有两种账号类型
两种账号都拥有
两种账号的地址格式:
私钥 -> 公钥 -> 地址。因此地址的生成需要三步:
先安装一下 sha3sum 获取 keccak-256sum
https://github.com/maandree/sha3sum
// on macOS
brew install sha3sum
# 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
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 的钱包地址,并且拥有密钥。
基于这个简单的原理,我们稍后可以简单的做一些有趣的小程序了。
如有更新请参考Blog地址