Web 3 j(JAVA)を使用してETH財布-2を開発

17991 ワード

一、紹介
上記では、テスト環境でアカウントを作成し、このような方法で自分の財布アドレスを作成することができ、テスト環境で使用することができます.https://www.rinkeby.io/#faucet自分にテストコインをチャージします.では、次の仕事はETHの振り替えを研究し、次の編でお話しします.ERC-20ベースのスマート契約を使用して、自分のTokenと自分の契約ベースの振り替えを作成する方法.
二、ETH振替の実現
振り替えにはいくつかのgasの問題があります.gasとは振り替えにかかる欠勤費であることを知っています.ここで私たちはgasLimitとgasPriceを通じて調整することができます.もちろん、gasが小さいことを望んでいますが、gasがひたすら小さいと、私たちが取引をパッケージしてくれる人がいなくなり、取引が最終的に成約できなくなり、pendingの状態になります.gasが多ければ、取引の成約速度は速くなりますが、私たちが費やしたお金は多くなります.
以前の実装に基づいて、自分で作成した財布と、財布に対応するファイルとパスワードを手に入れることができます.
方法1
この方法は自分のノードを使う必要があり,現在Infuraノードでは現在の操作ができず,対応するのも口座作成方法1の振り替えである.結局infuraは財布のファイルを保存するのに役立ちません
// ...
private BigInteger gNonce; //                      ,          

// ...      

try {
    EthGetTransactionCount ethGetTransactionCount = admin.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).sendAsync().get();
    BigInteger nonce = ethGetTransactionCount.getTransactionCount();
    PersonalUnlockAccount personalUnlockAccount = admin.personalUnlockAccount(from,password).send();
    if (personalUnlockAccount == null){
        log.error("    ,      ,        ");
        return 0;
    }
    if (gNonce == null){
        gNonce = nonce;
    }
    if (personalUnlockAccount.accountUnlocked())
    {
        BigInteger gasPrice = Contract.GAS_PRICE;
        BigInteger gasLimit = Contract.GAS_LIMIT;
        synchronized(WalletService.class) {
            Transaction transaction = Transaction.createEtherTransaction(from,nonce,gasPrice,gasLimit,to,amount);
            log.info("    :【{}】",gNonce);
            gNonce = gNonce.add(new BigInteger("1"));
            EthSendTransaction transactionResponse = admin.ethSendTransaction(transaction).sendAsync().get();
            if(transactionResponse.hasError()){
                String message=transactionResponse.getError().getMessage();
                log.error("    ,    {}",message);
            }else{
                String hash=transactionResponse.getTransactionHash();
                log.info("    ,  hash = {}",hash);
            }
        }
    }
} catch (InterruptedException | ExecutionException | IOException e) {
    log.error("    ,    {}",e);
}

この方法では、まずアカウントをロックする必要があります.セキュリティの問題があります.ノードがネットワーク全体にアクセスできる場合、イーサー坊ノードを動的にスキャンして接続し、ノードを通じて資金振替の操作を開始しようとする人もいます.
テスト中に自分のコインが何気なくアドレスに転送されていることに気づいたら、ノードや操作に上記の問題があることを示します.
  • Rinkeby: https://rinkeby.etherscan.io/address/0x7097f41f1c1847d52407c629d0e0ae0fdd24fd58
  • Ropsten: https://ropsten.etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58
  • Kovan: https://kovan.etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58
  • Mainnet: https://etherscan.io/address/0x7097f41F1C1847D52407C629d0E0ae0fDD24fd58

  • ここでは、APIポートをネットワーク全体に開放しないように注意する必要があります.ここでは特にコードのnonceに注意してください.下ではその他の役割について説明します.実は他にも上の振り替えのような方法があります.自分で研究することができます.
    方法2
    この方法では、財布ファイルを使用して取引を開始する必要があります.
    try {
        Credentials credentials = WalletUtils.loadCredentials(password,filePath);
        TransactionReceipt transferReceipt = Transfer.sendFunds(web3j, credentials, to,amount, Convert.Unit.WEI).send();
        String hash = transferReceipt.getTransactionHash();
        log.info("    ,  hash = {}",hash);
    } catch (Exception e) {
        log.error("    ,    {}",e);
    }
    

    この方式は比較的安全で、ここで注意しなければならないのはいくつかのETHの最小単位--WEIである.
    1ETH = 1*10^18 wei;
    三、関連問題
    1.ETH取引モジュールの特徴
  • トランザクションを順番に処理する必要があります(1のnonceが1のトランザクションは2のnonceを持つトランザクションの前に処理する必要があります)
  • .
  • はスキップしない(1,2,3のnonceを有する
  • まで4のnonceを有するトランザクションをブロックに含めることはできない.
    このようにして、ネットワークは取引の重複を識別し、注文を強制的に実行することができる(これはスマート契約にとって極めて重要である).
    2.振り込みのステータスを確認する方法
    振り替えてもらったTxHashで行けますhttps://etherscan.io/クエリー.
    3.Pendingステータスの振込をキャンセルする方法
    前述したように、振り替えはgas設定が小さいため、成約できない可能性があり、Pending状態にある.その後、nonceを通じてPendingの振り替えをキャンセルすることができ、nonceのメカニズムを通じて、nonceが新しく振り替えを作成すれば、nonceはPending状態の注文のnonceと同じように現在のPending状態を置き換えて振り替えられることが分かる.
    では、最善の操作は、自分に振り替える注文を開始することです.もちろんgasは合理的に設定する必要があります.振り替えは以上の2つの方法を参照してください.
    4.振り替えのキャンセルまたは置換
    前述の3で述べたように、実は1つの取引が発行された後、上書き、代替、キャンセルなどの操作の確率は小さいことがわかります.しかし不可能ではありません.現在の取引が掘削されず、ブロックに含まれていれば、関連操作を行うことができます.体の操作方法は3と似ていますが、nonceを変更することはできません.(具体的には実際と比較しなければならないが,結局,この操作が実現する確率はほぼ0である)
    四、振り込み状態照会コードの実現
    ここでは成功と失敗しか調べられませんが、一部の振り替えでは調べられませんが、現在の振り替えが存在しないか、pending状態であることは保証できません.対応方法を見つけたら教えてください.具体的に実現してくれてありがとう.
    try {
        EthGetTransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(transactionHash).send();
        TransactionReceipt transactionReceipt1 = transactionReceipt.getResult();
        if (transactionReceipt1 == null) {
            log.warn("  Hash    ,Hash = 【{}】",transactionHash);
        }else {
            if ("0x1".equals(transactionReceipt1.getStatus())){
                log.info("    ! Hash = {}",transactionHash)
            }
            if ("0x0".equals(transactionReceipt1.getStatus())){
                log.error("    ! Hash = {}",transactionHash)
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    五、参考文章
  • Checking or Replacing a TX After it’s Been Sent:https://kb.myetherwallet.com/transactions/check-status-of-ethereum-transaction.html
  • Cancel pending transactions on Ethereum:https://jakubstefanski.com/post/2017/10/ethereum-cancel-pending-transaction/
  • Node auto send a lot of transaction after call eth.sendTransaction() in one time:[https://github.com/ethereum/go-ethereum/issues/16691](Node auto send a lot of transaction after call eth.sendTransaction() in one time)
  • Web3j:https://web3j.readthedocs.io/en/latest/