以太坊密钥转换
以太坊的每一个账号私钥都通过密码加密存放到一个keystore文件中,如果创建一个账户涉及:
- 生成ECDSA密钥
- 使用密码
- 将加密信息生成json格式,等待写入到keystore文件
- 创建keystore文件
- 将信息写入到keystore文件
经过测试,这一个过程需要耗时大约5s,也就是每创建一个账户都要耗时5s,如果要创建1万个测试账号,需要5万秒,需要将近14小时,需要进行并发,才能尽量减少时间浪费,但是,使用5s才生成1个账号,还是太浪费了。
读取1个keystore文件涉及:
- 读keystore文件
- 对数据进行解密,将账号保存到内存
经过测试,这个过程需要耗时大约3s,1万个账号顺序读取需要大约8小时。
能不能并发读取?
不能。读取keystore时,指定的是keystore文件所在的目录,它会读取所有的keystore文件,在内存中保存到1个Keystore
对象中。
如果我们写一个测试程序,以太坊账号的管理,简直是一个噩梦。
有没有其他办法,能够加快账号的读取,交易的签名等?
交易的签名本质是使用go的ecdsa.PrivateKey
,没有以太坊这些账户加密和解密操作,这些操作是上述测试耗时的原因,直接使用ecdsa.PrivateKey
,使用后保存到文件,使用时从文件读取,可以从若干小时,降低到不到1s。
我们使用ecdsa.PrivateKey
的思路:
- 使用
ecdsa.GenerateKey()
生成私钥 - 私钥能转为16进制字符串,把字符串保存到文本文件,每一行都是1个私钥的16进制
- 使用时从文件读取每一个账号的16进制字符串,然后转换成所有的私钥
16进制字符串和ecdsa.PrivateKey
相互转换是非常简单的,ecdsa.Private
和以太坊的账号转换,则是非常乱的,整理出来了一幅图,没这幅图,每次看都要梳理一段时间,浪费生命。
图注:
keystore
代表包名,Keystore
代表类型- 以
()
为函数,否则为类型