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
1703877814
1703877815
1703877816
1703877817
上述代码直到由seed生成地址的部分都无须解释。然后给ks的passwordProvider属性分配一个回调函数。该回调函数在签署交易时被调用,以获取密码解码私钥。如果不提供,LightWallet就会提示用户输入密码。此时,通过传送keystore作为交易签署者创建一个HookedWeb3Provider实例。当自定义服务提供方想签署交易时,它调用ks的hasAddress方法和signTransactions方法。如果要签署的地址不在生成的地址之中,ks将向自定义服务提供方返回错误。最后使用web3.eth.sendTransaction方法发送一些以太币。
1703877818
1703877819
1703877820
1703877821
1703877823
区块链项目开发指南 5.6.5 测试
1703877824
1703877825
钱包服务的创建已经完成了,让我们测试一下,确保它像预想的那样工作。首先,在Initial目录中运行node app.js,然后在浏览器中访问http://localhost:8080,运行界面如图5-11所示。
1703877826
1703877827
1703877828
[
上一页 ]
[ :1.703877779e+09 ]
[
下一页 ]