1703877764
在一些算法中或者需要随机数的地方会用到熵。熵通常来自于硬件源或者已经存在的硬件源,例如鼠标移动,或者特别提供的随机数生成器。
1703877765
1703877766
生成一个独特的seed需要非常高的熵。LightWallet内置了生成唯一seed的方法。LightWallet生成熵使用的算法取决于环境。但是如果能生成更好的熵,就可以把生成的熵传送给generateRandomSeed(),它将在内部与generateRandomSeed()生成的熵进行拼接。
1703877767
1703877768
生成随机seed之后,调用generate_Addresses方法。该方法以seed作为参数,并在其中显示地址。在生成地址之前,它会问用户想要多少个地址。
1703877769
1703877770
generate_Addresses()方法的实现如下。把如下代码放入main.js文件中:
1703877771
1703877772
1703877773
1703877774
1703877775
1703877776
1703877777
1703877778
上述代码的执行过程如下:
1703877779
1703877780
1)首先有一个变量totalAddresses,它存储用户希望生成的地址总数。
1703877781
1703877782
2)检查参数seed是否定义了。如果没有定义,则从输入栏抓取seed。这样做,generate_Addressess()方法可以用于显示信息seed,如果用户单击Generate Details按钮,还同时生成一个新的seed。
1703877783
1703877784
3)使用isSeedValid()方法验证keystore命名空间的seed。
1703877785
1703877786
4)请用户输入想要生成和展示多少地址并进行验证。
1703877787
1703877788
5)keystore命名空间中的私钥总是加密存储的。在生成密钥时,需要进行加密;在签署交易时,需要解密。衍生对称加密密钥的密码可以由用户输入,或者提供一个随机字符串作为密码。为了使用户体验更好,生成一个随机字符串,将它用作密码。对称加密密钥没有存储在keystore命名空间里,因此只要进行与私钥相关的操作,例如生成密钥、访问密钥等,就需要从密码生成密钥。
1703877789
1703877790
6)使用createVault方法创建keystore实例。createVault用一个对象和一个回调函数作为参数。对象可以有4种属性:password、seedPharse、salt和hdPathString。password是必选项,其他的都是可选项。如果不提供seedPharse,它会生成和使用一个随机seed。拼接salt与password,以提高对称密钥加密技术的安全性,因为攻击者不仅要找到password还得找到salt。如果不提供salt,它就会随机生成。keystore命名空间存储未加密的salt。hdPathString用于为keystore命名空间提供默认衍生路径,即生成地址、签署交易等。如果不提供衍生路径,则使用该衍生路径。如果不提供hdPathString,则默认值为m/0’/0’/0’。这个衍生路径的默认目的是签名。可以创建新的衍生路径或者使用keystore实例的addHdDerivationPath()方法重写当前衍生路径的purpose。还可以使用keystore实例的setDefaultHdDerivationPath()方法改变默认衍生路径。最后,一旦keystore命名空间被创建,就通过回调函数返回实例。所以,这里仅用keyword和seed创建了一个keystore。
1703877791
1703877792
7)生成用户指定数量的地址及其相关密钥。从一个seed中可以生成数百万个地址,因为keystore不知道用户想生成多少个地址,所以在此之前不会生成任何地址。在创建keystore之后,使用keyFromPassword方法从密码中生成对称密钥,然后调用generateNewAddress()方法生成地址及其相关密钥。
1703877793
1703877794
8)generateNewAddress()有3个实参,即密码衍生的密钥、生成地址的数量和衍生路径。因为没有提供衍生路径,它使用keystore的默认衍生路径。如果多次调用generateNewAddress(),它会从在最后一次调用中创建的地址重新开始。例如,如果调用该方法两次,每次生成两个地址,则将得到前四个地址。
1703877795
1703877796
9)使用getAddresses()获取存储在keystore上的全部地址。
1703877797
1703877798
10)使用exportPrivateKey方法解码和检索地址私钥。
1703877799
1703877800
11)使用web3.eth.getBalance()获取地址余额。
1703877801
1703877802
12)在未排序的列表中显示全部信息。
1703877803
1703877804
上面介绍了从seed生成地址及其私钥的方法。现在编写send_ether()方法的实现,该方法用于从一个由seed生成的地址发送以太币。
1703877805
1703877806
相关代码如下。将这段代码放入main.js文件:
1703877807
1703877808
1703877809
1703877810
1703877811
1703877812
1703877813
[
上一页 ]
[ :1.703877764e+09 ]
[
下一页 ]