wallet

助记词 -> 种子 -> 私钥 -> 公钥 -> 地址

公钥映射成地址的时候会加入ss58参数(ss58是不同链的唯一标识),因此根据地址可以解析出这个地址是哪条链的地址。

生成助记词后如何获取address?

根据keystore文件导入账户是需要验证密码的,钱包导出keystore文件时需要设置密码吗?
根据助记词导入账户需要验证密码吗?

绑定钱包的时候传的是公钥,注意是公钥,不是地址,
查询用户绑定的钱包公钥, 客户端获取到公钥后根据ss58映射为地址,转账的时候用的地址

encodeAddress

成功发送一笔交易后就要调后台保存交易的接口,状态是1

用户已经绑定了公钥,
再次绑定时,如果绑定的公钥和之前绑定的公钥一样,那么服务器返回200;
如果绑定的公钥和之前绑定的公钥不一样,那么,如果这个新公钥没有被别人绑定过,那么返回200绑定成功,如果这个新公钥已经被别人绑定过,那么返回302绑定失败

xbtc的转账数量要乘以100000000,交易手续费也要乘以100000000

导入助记词后,walletSdk是如何保存钱包账户的,保存在本地?

flutter的主要方法

_initApi()
_connectNode()

_encodeAddress,需要连接钱包节点
_estimateTxFee,需要连接钱包节点
_sendTx,需要连接钱包节点
_generateMnemonic
_importFromMnemonic
_importFromKeystore
loadAccount

连接钱包节点

//api.dart

  /// connect to a list of nodes, return null if connect failed.
  Future<NetworkParams> connectNode( Keyring keyringStorage, List<NetworkParams> nodes) async {
    _connectedNode = null;
    final NetworkParams res = await service.webView.connectNode(nodes);
    if (res != null) {
      _connectedNode = res;

      // update indices of keyPairs after connect
      keyring.updateIndicesMap(keyringStorage);
    }
    return res;
  }

需要连接钱包节点后才能正常执行的接口

encodeAddress

encodeAddress()方法必须要连接上钱包节点后才能调用,因为encodeAddress()把PublicKey映射为address需要ss58,而encodeAddress()使用的是connectedNode的ss58,看下代码:

//apiAccount.dart

  /// encode addresses to publicKeys
  Future<Map> encodeAddress(List<String> pubKeys) async {
    final int ss58 = apiRoot.connectedNode.ss58;
    final Map res = await service.encodeAddress(pubKeys, [ss58]);
    if (res != null) {
      return res[ss58.toString()];
    }
    return null;
  }

新增了一个encodeAddress方法可以不用使用connectedNode的ss58,可以直接传递ss58参数

estimateTxFee

评估交易费用

//apiTx.dart

  /// Estimate tx fees, [params] will be ignored if we have [rawParam].
  Future<TxFeeEstimateResult> estimateFees(TxInfoData txInfo, List params,
      {String rawParam}) async {
    final String param = rawParam != null ? rawParam : jsonEncode(params);
    final Map tx = txInfo.toJson();
    final res = await service.estimateFees(tx, param);
    return TxFeeEstimateResult.fromJson(res);
  }

如果没有连接钱包节点,调用该接口时不会有返回结果,而是webview报错:

securesms I/flutter: _estimateTxFee, senderPubkey==0xdc3b9f336fdc212eb903bd5c6b03c8bd13d09fe3c0c391c083cc1cc9f4f3f068 ,senderAddress=15ymFGetVrZBYM132yHcK2pSydKBktDRgXU8eFHxzrVxtBQq ,recipientAddress=15ymFGetVrZBYM132yHcK2pSydKBktDRgXU8eFHxzrVxtBQq ,amount=1000
securesms I/chromium: [INFO:CONSOLE(1)] "Uncaught ReferenceError: api is not defined", source: https://localhost:8080/ (1)

但调用接口不会有回调。

signAndSend

发送交易

  Future<Map> signAndSend(Map txInfo, String params, password,
      Function(String) onStatusChange) async {
    final msgId = "onStatusChange${serviceRoot.webView.getEvalJavascriptUID()}";
    serviceRoot.webView.addMsgHandler(msgId, onStatusChange);
    final code =
        'keyring.sendTx(api, ${jsonEncode(txInfo)}, $params, "$password", "$msgId")';
    // print(code);
    final Map res = await serviceRoot.webView.evalJavascript(code);
    serviceRoot.webView.removeMsgHandler(msgId);

    return res;
  }

如果断了网络,这个接口不会返回,几不会调用接口的回调,会一直阻塞等待,至于有没有超时时间,没有测试…
测试时,大概是3分钟,一直没有回调。

总结

因此,评估手续费和转账的接口是必须要连接节点的

发送转账消息与发送转账记录

流程:
1.调用钱包sdk发送一笔转账
2.钱包sdk返回转账成功后就立即前往会话页面向对方发送一条转账消息,同时向后台提交转账记录。

详细分析:
1.联系人转账时,钱包sdk返回转账成功后就需要前往会话页面向对方发送一条转账消息(走的是websocket),同时提交转账记录到后台,但无论转账记录提交到后台是否成功都是要给对方发送转账消息的,即不需要等提交转账记录到后台成功后才向对方发送一条转账消息,而是钱包sdk返回转账成功后就立即前往会话页面向对方发送一条转账消息。
对于联系人转账,钱包sdk返回转账成功后,优先是发送转账消息,提交转账记录的优先级比较低。

2.地址转账时,钱包sdk返回转账成功后,就向后台提交转账记录,后台返回成功后跳转到我的钱包页面,可以查看转账历史记录。

我的钱包

查询转账记录,是根据手机号查询的,手机号绑定过的钱包的转账记录都可以查到
查询余额,就是查询手机号当前绑定的钱包地址上的余额

调用登出接口 “/v1/accounts/apn”; 后台会删除该手机号绑定的钱包公钥
用户登录时调用验证码接口,验证成功(即登录成功)也会删除该手机号绑定的钱包公钥

账号重新登录之后不管之前有没有绑定过钱包,默认就是未绑定钱包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值