私链账户管理及节点互联

1,372 阅读3分钟

账户:

说私链账户管理之前我们先聊聊以太坊的账户存储方式:

  • keystore Keystore 文件是以太坊钱包存储私钥的一种文件格式 (JSON)。它使用用户自定义密码加密,以起到一定程度上的保护作用
  • 助记词 助记词是明文私钥的另一种表现形式, 最早是由 BIP39 提案提出, 其目的是为了帮助用户记忆复杂的私钥 (64位的哈希值)。助记词一般由12、15、18、21个单词构成, 这些单词都取自一个固定词库, 其生成顺序也是按照一定算法而来。
  • 明文私钥 用户的钱包地址由公钥经过 keccak256 计算,截取后 40 位 + 0x 得到的。 私钥的样式为 64 位 16 进制的哈希值字符串。

特别提醒:一定不要忘记私钥的密码,一旦忘记无法找回

创建账户的底层分解为 3 个步骤:

  1. 创建随机私钥 (64 位 16 进制字符 / 256 比特 / 32 字节)
  2. 从私钥推导出公钥 (128 位 16 进制字符 / 512 比特 / 64 字节)
  3. 从公钥推导出地址 (40 位 16 进制字符 / 160 比特 / 20 字节)

图片

这是一件很奇妙的事情,2 行文字,6 行代码承载着亿万级别的资产,但往往越简单,越奥妙。以上的 6 行代码,就已经囊括密码学中大多数技术,比如随机数生成器、非对称加密,单向散列函数等。

geth命令行管理账户

通过geth的命令行工具来生成账户钱包,生成的钱包存放在启动命令指定的datadir/keystore下面,文件命名格式:UTC--<created_at UTC ISO8601>-<address hex>

COMMANDS:

    list    显示所有的账户
    new     创建一个新的账户
    update  更新一个账户
    import  通过私钥导入一个账户

创建一个账户:

$ geth account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase:
Address: {168bc315a2ee09042d83d7c5811b533620531f67}

通过--help来获取命令的帮助信息.这几个命令都可以指定--datadir来指定要指向的目录,避免创建到其他私链或主网

$ geth account list --help
list [command options] [arguments...]

Print a short summary of all accounts

OPTIONS:
  --datadir "/home/bas/.ethereum"  指定datadir的位置
  --keystore                       指定keystore的位置,默认在datadir里面

或者通过终端来创建账户:

> personal.NewAccount()
... 输入密码2次 ...

or

> personal.newAccount("密码")

或者导入账户

geth account import <keyfile>

补充:通过jsonApi来创建钱包 因为要开发轻钱包应用,可能会需要用到服务端帮忙创建的情况 可以使用JSON-RPC 2.0接口来创建。前提,在创建私链的时候启用了personal模块

# Request
$ curl -X POST --data '{"jsonrpc":"2.0","method":"personal_newAccount","params":["password"],"id":1} http://127.0.0.1:8545'

# Result
{
  "id":1,
  "jsonrpc": "2.0",
  "result": ["0x05ca0ddf7e7506672f745b2b567f1d33b7b55f4f"]
}

特别提醒:一定不要忘记私钥的密码,一旦忘记无法找回

节点连接:

私链之间的节点连接有两个关键要素:

  • 创世文件 init.json
  • 网络id --networkid

以上两个关键的数据不一致就会导致节点无法互联,且没有报错,特别是networkid. 连接节点有四种方式,

第一种使用--bootnode,

第二种使用终端的admin.addPress方法

第三种使用RPC的admin_addPeer

第四种使用静态节点

1.使用 bootnodes

在启动节点的时候指定--bootnodes的方式来添加节点,多个节点可以使用逗号隔开。注意私链在启动时还需要加上其他的参数

geth --bootnodes enode://pubkey1@ip1:port1,enode://pubkey2@ip2:port2,enode://pubkey3@ip3:port3

2.使用终端命令添加

这个都很简单,在控制台中键入命令即可。

admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303")

3.使用 admin_addPeer

# Request
$ curl -X POST --data '{"jsonrpc":"2.0","method":"admin_addPeer","params":["enode://f4642fa65af5......"],"id":1} http://127.0.0.1:8545'

# Result
{
  "id":1,
  "jsonrpc": "2.0",
  "result": true
}

4.使用静态节点

静态节点必须是你信任的节点,将这些节点用json数组的形式写在<datadir>/geth/static-nodes.json文件中.

[
  "enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
  "enode://pubkey@ip:port"
]

上面提到的方法都会将节点添加到静态节点列表,当节点断开时会自动重新连接

引用:

关于钱包的基础密码学

Manage your accounts (geth =1.7)

Management APIs

How can I make new account by JSON-RPC?

Connecting to the network