以太坊密钥转换

以太坊的每一个账号私钥都通过密码加密存放到一个keystore文件中,如果创建一个账户涉及:

  1. 生成ECDSA密钥
  2. 使用密码
  3. 将加密信息生成json格式,等待写入到keystore文件
  4. 创建keystore文件
  5. 将信息写入到keystore文件

经过测试,这一个过程需要耗时大约5s,也就是每创建一个账户都要耗时5s,如果要创建1万个测试账号,需要5万秒,需要将近14小时,需要进行并发,才能尽量减少时间浪费,但是,使用5s才生成1个账号,还是太浪费了。

读取1个keystore文件涉及:

  1. 读keystore文件
  2. 对数据进行解密,将账号保存到内存

经过测试,这个过程需要耗时大约3s,1万个账号顺序读取需要大约8小时。

能不能并发读取?
不能。读取keystore时,指定的是keystore文件所在的目录,它会读取所有的keystore文件,在内存中保存到1个Keystore对象中。

如果我们写一个测试程序,以太坊账号的管理,简直是一个噩梦。

有没有其他办法,能够加快账号的读取,交易的签名等?

交易的签名本质是使用go的ecdsa.PrivateKey,没有以太坊这些账户加密和解密操作,这些操作是上述测试耗时的原因,直接使用ecdsa.PrivateKey,使用后保存到文件,使用时从文件读取,可以从若干小时,降低到不到1s。

我们使用ecdsa.PrivateKey的思路:

  1. 使用ecdsa.GenerateKey()生成私钥
  2. 私钥能转为16进制字符串,把字符串保存到文本文件,每一行都是1个私钥的16进制
  3. 使用时从文件读取每一个账号的16进制字符串,然后转换成所有的私钥

16进制字符串和ecdsa.PrivateKey相互转换是非常简单的ecdsa.Private和以太坊的账号转换,则是非常乱的,整理出来了一幅图,没这幅图,每次看都要梳理一段时间,浪费生命。

图注:

  1. keystore代表包名,Keystore代表类型
  2. ()为函数,否则为类型