Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
用户环境检查( f& X/ v5 {0 z
既然需要使用Web3.js API 在页面中进行转账, 首先应该检查在浏览器环境有没有安装好钱包,并且钱包应该是解锁状态。
( y2 z+ e# ]& X2 z3 Y先检查是否安装了MetaMask钱包:2 i* {, ]* z9 u) \- q2 r( t/ ?
  1. window.addEventListener('load', function() {- @, J4 \7 r) a; ]: r  }
  2.         if (typeof web3 !== 'undefined') {
    + t) c1 K6 ~6 z7 y) j$ P; O
  3.             web3 = new Web3(web3.currentProvider);! c/ [/ i, n8 Y# z1 w. y
  4.             if (web3.currentProvider.isMetaMask == true) {
    2 D( h$ g2 B) |7 u1 X: ~
  5.                 // "MetaMask可用"3 q  d) B* W3 I* Z( h! O
  6.             } else {5 v& e( A% ?2 I% ^6 i, `4 U+ k
  7.                 // "非MetaMask环境"
    ! B- A$ x' e  O3 K5 b
  8.             }( P" H1 m/ Z! G/ m. m: d9 _* u
  9.         } else {7 @# u3 p6 r' B
  10.             $("#env").html("No web3? 需要安装<a href="https://metamask.io/" target="_blank">MetaMask</a>!");
    ) R& D; {* b6 G3 J0 F/ Y1 @
  11.         }8 n; A; T& `4 N1 ?+ w8 B$ s
  12. }
复制代码

6 Q7 z7 ~9 Y6 ?MetaMask推荐在window加载时,进行MetaMask的检查,当然在没有安装MetaMask时,也可以指定一个节点Provider来创建web3
3 m/ {8 ~9 }" z# ^% P2 n0 G检查是否钱包已经解锁:5 C. R& O+ D4 W
我们在发送交易之前应该先首先检查一下当前钱包的一个状态,检查钱包是否解锁(是否输入了密码进入了MetaMask),通常使用eth下面的getAccounts来进行检查,getAccounts是会返回账号的一个列表,如果当前账号列表里面有数据的话,说明钱包已经解锁可以获得到账号,如果账号拿到的列表是空的话,那么说明钱包没有解锁。
: L- _! C) x1 ^2 \  ?/ ~2 W可以把下面的代码加到上面的监听函数中:
" i5 d. z6 l( k* v( H
  1. web3.eth.getAccounts(function (err, accounts) {
    4 L" M/ C8 D9 T5 C7 H4 }1 v' W
  2.             if (accounts.length == 0) {6 s# R5 s* G7 X: m1 p! z) c% o
  3.                 $("#account").html("请检查钱包是否解锁");
    7 J4 @4 I7 M, h' O0 c1 k$ I! z$ v
  4.             }
    8 P6 D5 D/ }8 ^$ d! T/ R. j, y
  5.             });
复制代码

8 E6 X2 u" j4 n; j7 r7 `/ n* M# y! L$ Z发送交易  j6 [; F* U0 }, {1 J, R3 j+ y
如果MetaMask钱包是解锁的,我们就可以来发送交易,发送交易使用sendtransaction这个方法。
$ M$ ^$ x2 r" ?/ H, [, S( X- Bweb3.eth.sendTransaction(transactionObject [, callback])
  E" U% n4 x; k+ e0 ]  Q# o第二个参数是回调函数用来获得发送交易的Hash值。
- e6 T! o+ w$ j: ~$ F+ p第一个参数是一个交易对象,交易对象里面有几个字段:
2 g3 w7 B# Q' w1 X9 wfrom : 就是从哪个账号发送金额to : 发动到到哪个账号value 是发送的金额gas: 设置gas limitgasPrice: 设置gas 价格
2 Z* K% P9 W* e$ d) b

  O2 {* R8 p) |8 c  `, Z如果from没有的话,他就会用当前的默认账号, 如果是转账to和value是必选的两个字段。+ ~* [" N! y) |0 z5 L/ {6 b
在发送交易的时候弹出来MetaMask的一个授权的窗口,如果我们gas和gasPrice没有设置的话,就可以在MetaMask里面去设置。如果这两个gas和gas Price设置了的话,MetaMask就会使用我们设置的gas。
  k, N+ x4 r4 V7 @8 S. ~+ F因此在发送交易的时候,关键是构造这样一个交易对象,JavaScrpt代码如下:& w; t- w1 Y0 K5 ^, T/ p9 u
  1. //  这里使用Metamask 给的gas Limit 及 gas 价6 s& ~; z$ }& v% U
  2. var fromAccount = $('#fromAccount').val();
    $ N  J- D. ^  n6 T0 w" H. X
  3. var toAccount = $('#toAccount').val();
    & w' h# X# i+ |. e
  4. var amount = $('#amount').val();% [, Z5 Q: G3 v+ c( n3 \
  5. // 对输入的数字做一个检查
    6 q6 @! W- I( k' j" n6 T
  6. if (web3.isAddress(fromAccount) &&
    . T- X/ C5 X  U
  7.             web3.isAddress(toAccount) &&: ^8 U# K& k4 J
  8.             amount != null && amount.length > 0) {' @; q1 g! w0 j3 Z5 u; l! Z" ^9 `
  9.     var message = {from: fromAccount, to:toAccount, value: web3.toWei(amount, 'ether')};6 A9 L4 J! ?8 s$ T6 p; s) H
  10.     web3.eth.sendTransaction(message, (err, res) => {
    # m' b/ F2 T/ `
  11.         var output = "";
    , v) U1 ?: {) R5 O, f/ ~
  12.         if (!err) {
    6 B. y+ g; j  N4 y/ Q4 h- L7 f
  13.             output += res;
    7 r0 U/ g$ v4 J& `0 F0 K/ p
  14.         } else {2 R& M, K3 k/ X' W8 @* Q
  15.             output = "Error";& r' `( \& ]/ ]% f/ o7 N8 [5 a
  16.         }
    " ?& v7 ]; u7 a. \2 ?
  17.     }4 O# X' d6 r; m! K4 I  ^, i& j
  18. }
复制代码
; f7 f4 A# u' p8 ?+ h0 d9 @
补充说明:$('#fromAccount').val()是使用JQuery用来获取用户输入内容,其次应该在实际构造发送交易之前对输入的参数做一个判断,web3.isAddress用来检查字符串是不是地址。另外对于一个向普通外部地址账号的转账,消耗的gas 是固定的21000。
7 V  D, N! z: M6 r# k( x
7 a7 J7 ?" Q1 r5 _运行测试' i& |/ ]: t' R+ J9 h! b( G% t
需要注意一点的是,由于安全原因,MetaMask只支持站点方式访问的页面,即通过http:// 来访问页面,在浏览器中通过file:// + 文件地址的方式是不行的。/ p1 S& e( b3 D4 y* ~

. V2 Q; K$ a* u: J, y: n  r因此需要把编写的代码放置到web服务器的目录下,自己试验下。
0 C6 G+ Z& F% L
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

杨小公子君莫邪 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13