1. Hi区块链首页
  2. 资讯
  3. 技术指南

墨客区块链(MOAC BlockChain) 钱包开发(1)

墨客区块链(MOAC BlockChain) 钱包开发知识(一)

一、术语

1.1 gas,Gas Limit和Gas Price在墨客区块链上,发送代币或调用智能合约、执行写入操作,需要支付矿工计算费用,计费是按照Gas计算的,Gas使用moac来支付。无论调用的方法是成功还是失败,都需要支付计算费用。即使失败,矿工也验证并执行交易(计算),因此必须和成功交易一样支付矿工费。

Gas Limit称为限额,它是用户愿意在一笔交易中花费Gas的最大数量。交易所需的Gas是通过调用智能合约执行多少代码来定义。如果您不想花太多的Gas,通过降低Gas Limit将不会有太大的帮助。因为您必须包括足够的Gas来支付的计算资源,否则由于Gas不够导致交易失败,您所设置的所有Gas limit也将消耗光。建议您在有充足moac情况下,将Gas Limit尽量设高,所有未使用的Gas将在转账结束时退还给您。

通过降低Gas Price可以节省矿工费用,但是也会减慢矿工打包的速度。矿工会优先打包 Gas Price设置高的交易,如果您想加快转账,您可以把Gas Price设置得更高,这样您就可以排队靠前。如果您不急,您只需要设置一个安全的 Gas Price,矿工也会打包您的交易。

1.2 moac单位moac最小的单位是sha,最常用的单位是mc。

3HLQTVwT3JqFQvLupi57kYOa7UqppEik8IDKpRbF.png

1.3 keystorekeystore是账户的一种表现形式,里面包含了账户的地址,账户密文的私钥和MAC地址等等一系列的信息,下面是一个keystore的完整信息。

qKF4fJ0jsCgymdTVx4c4ZkMOgPHqf9sK2SV3hYEZ.png

1.5 元交易

元交易是这样一种发送交易的模式:发送方先对一个合法的交易签名,然后把该交易和签名通过链下传递的方式转交给一个中继方,该中继方愿意承担该笔交易的 gas 费并最终发送交易到网络中。

这种元交易模式很有用,因为发送方不再需要在发送账户中存有moac,从用户体验角度这很有益处。

元交易最终的目标地址一般都是某个合约,且在某种程度上,该合约知道,交易的签名方并不是交易实际的发送者。此时,交易 API 的 msg.sender 字段会返回中继方的地址,但其很可能并没有代表签名方操作的权利,所以在这个场景下(仅仅查看 msg.sender 字段)并没有太大意义。因此,许多元交易依赖链上的签名校验(通过 API 的 ecRecover 函数)来保证签名方账户的确是在一份合适的白名单里面(有权限操作该交易想要执行的指令)。

1.4 其他

Nonce:交易计数器,即该账户主动发起的交易数量,从0开始计数。助记词:通过算法从词库里面产生12-24个单词,目前支持多种语言。随机种子:使用助记词通过算法产生的一个随机字符串。私钥:钱包中最重要的东西,钱包实际上就对私钥进行管理,现在私钥有主私钥和派生私钥的说法。主私钥:钱包私钥,由助记词产生的随机种子生成,主私钥被盗的话,你的整个钱包的钱将全部被盗。派生私钥:由主私钥通过bip分层协议生成的私钥,派生私钥丢失,只会丢失单一账上的数字资产。备份钱包:其实也叫备份助记词,现在的钱包基本上都是用助记词恢复的。备份私钥:对钱包的主私钥或者派生私钥进行备份,通过主私钥可以找回钱包中所有的账户,通过派生私钥只能找回其中的一个账户。导入钱包:通过导入助记词或者私钥的方式生成以前的钱包。导入私钥:通过导入私钥生成多链多账户钱包,或者单链单账户钱包。单链钱包:只支持一条链的钱包,比方说比特币钱包。多链钱包:支持所有币种的钱包。单账户钱包:每种币只支持一个账户。多账户钱包:每种币支持多个账户。地址:类似于银行卡账户,通过地址可以查询到目前账户上的余额。公钥:对所有人公开的秘钥。签名:在发起数字资产转账时,所有的币种都要对转账的数据进行签名,签名的数据量对于不同的币种不一样。空投:就是批量打币。bip协议簇:HD分层钱包中的一个重要的规定,是数字货币发展的必然产物。非确定性钱包:每个账户对应一个私钥,私钥不好管理。确定性钱包:有主私钥,通过主私钥可以生产其他所有币种的私钥,但不能支持多账户。确定性分层钱包:有主私钥,通过主私钥可以生产其他所有币种的私钥,支持多账户。二、开源库keythereumKeythereum是一个用于生成,导入和导出密钥的JavaScript工具。这提供了一种在本地和Web钱包中使用同一帐户的简单方法。它可用于可验证和存储钱包。

Keythereum使用相同的密钥派生函数(PBKDF2-SHA256或scrypt),对称密码(AES-128-CTR或AES-128-CBC)和消息验证代码。您可以将生成的密钥导出到文件,将其复制到数据目录的密钥库,然后立即开始在您的本地客户端中使用它。

从版本0.5.0开始,keythereum的加密和解密函数都返回Buffers而不是字符串。对于直接使用这些功能的人来说,这是一个重大改变。

gXMYxpVb7Wka6NPZiTRYeVIvvqB2GNLStHBfRszl.png

生成一个新的随机私钥(256位),以及密钥派生函数使用的salt(256位),用于AES-128-CTR的初始化向量(128位)对密钥进行加密。如果传递回调函数,则create是异步的,否则是同步的。

下面是生成keystore的代码:

8XXSTj4pgRPvPVIR5TeLqjTRX1tH1UcNamZRwwUm.png

运行结果:

lK3xIFP2ABS8r66j9QrBvYocC40kvK5U3ctLtbqU.png

2.2 将keystore保存到文件中:

dump创建一个对象而不是JSON字符串。在Node中,exportToFile方法提供了一种将此格式化的密钥对象导出到文件的简便方法。它在keystore子目录中创建一个JSON文件,并使用geth的当前文件命名约定(ISO时间戳与密钥派生的以太坊地址连接)。

代码如下:

TC8VAPl6ENKxKPMS1Elb6wMcavc2u9Z37seZCJN7.png

成功之后在你的keystore目录下将看到一个keystore格式的账号文件,如果出现错误,最可能的原因就是你的目录下没有keystore这个目录,当然以上代码中你也可以指定keystore的存储目录。

2.3 keystore的导入:

从keystore密钥库导入密钥只能在Node上完成。将JSON文件解析为与上面的keyObject具有相同结构的对象。

以下代码需要在keystore目录下已经存在keystore格式的账号文件。

ZDJOn9O1TfJomskSJW8zGrXVLFNNz4TzFyHH1GE0.png

gZ0HKtCkn8S5QhDA5wJcGCozXGv25etQpEurL3F1.png

2.4 从keystore中恢复私钥:

这里恢复出来的私钥是buffer格式的,password是你设置的密码,keyObject就是keystore。

fZQsPO5ifUHz4ugMlUu4u649iqlyeCHBLBdl9hTi.png

EcuqF2hjESxKTV5GkHd4qer9Bm9fr9gXG0q1sOdS.png

mz4lrDsWglEADOZlbV8SdLnZDDyOBTKiVdTMuZxY.png

teHvO3qiuGZnZICyqWr2WFIc7P0pv9mcWGKjRO4Y.png

3.4 从公钥得到地址

pgv4Mf7VJ3xx4RhsSbLLV1hR1mSflgJ0ZvymmNMY.png

3.6 从签名信息获得地址

此处需要知道明文信息。

DLf8cjcD4l01Xot7tztQhP7Uxvhfdv6mKIMRPf5l.png

GOEhr71HySCI9Q0LO220gvGBEvWSVHM62EKvjmaG.png

声明:登载此文出于传递更多信息之目的,观点仅代表作者本人,绝不代表Hi区块链赞同其观点或证实其描述。
提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。