账户:
说私链账户管理之前我们先聊聊以太坊的账户存储方式:
keystoreKeystore 文件是以太坊钱包存储私钥的一种文件格式 (JSON)。它使用用户自定义密码加密,以起到一定程度上的保护作用助记词助记词是明文私钥的另一种表现形式, 最早是由 BIP39 提案提出, 其目的是为了帮助用户记忆复杂的私钥 (64位的哈希值)。助记词一般由12、15、18、21个单词构成, 这些单词都取自一个固定词库, 其生成顺序也是按照一定算法而来。明文私钥用户的钱包地址由公钥经过 keccak256 计算,截取后 40 位 + 0x 得到的。 私钥的样式为 64 位 16 进制的哈希值字符串。
特别提醒:一定不要忘记私钥的密码,一旦忘记无法找回
创建账户的底层分解为 3 个步骤:
- 创建随机私钥 (64 位 16 进制字符 / 256 比特 / 32 字节)
- 从私钥推导出公钥 (128 位 16 进制字符 / 512 比特 / 64 字节)
- 从公钥推导出地址 (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"
]
上面提到的方法都会将节点添加到静态节点列表,当节点断开时会自动重新连接
引用: