✍️

Metamaskに繋がずに署名をしたい!

2022/08/09に公開

署名の度にポップアップが立ち上がるのはめんどくさい!

Metamaskのポップアップはすごく丁寧なUXで素晴らしいと思っています。しかし、たまにはポップアップを立ち上げずに署名してトランザクションを飛ばしたいときもあるはず、ということでMetamaskを通さずに署名をして送金していきます。

コード全体

App.jsx
import "./App.css";
import { ethers } from "ethers";
const PRIVATE_KEY = //privatekeyを入力
const INFURA_API_KEY = //infuraのapikeyを入力
//投げ銭用のアドレス
const TIP_ADDRESS = "0xDEBf97515Df321551326FB4c858F5E36D7073AF7";

const App = () {
  const doAction = () => {
    const provider = new ethers.providers.JsonRpcProvider(
      "https://mainnet.infura.io/v3/{$INFURA_API_KEY}"
    );
    const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    const amount = "0.01";

    let tx = {
      to: TIP_ADDRESS,
      value: ethers.utils.parseEther(amount),
    };

    wallet.sendTransaction(tx).then((txResult) => {
      console.log(txResult);
    });
  };

  return (
    <div className="App">
      <a onClick={doAction}>投げ銭!</a>
    </div>
  );
}

export default App;

Infuraに登録してAPIキーを手に入れる

ブロックチェーンとコミュニケーションをするために窓口となるノードを設定します。Infuraがその窓口を作ってくれるので、その場所を指定するイメージです。

const provider = new ethers.providers.JsonRpcProvider(
  "https://mainnet.infura.io/v3/{$INFURA_API_KEY}"
);

PRIVATE_KEYを用いてウォレット登録

トランザクションを送るための送り元のウォレットをPRIVATE_KEYとproviderから設定します。

const wallet = new ethers.Wallet(PRIVATE_KEY, provider);

トランザクションの準備

ここではトランザクションを準備します。今回はtoにETHを送りたいユーザー、valueに送りたいETHの量を設定しました。

const tx = {
  to: TIP_ADDRESS,
  value: ethers.utils.parseEther(amount),
};

ウォレットからトランザクションを送信

最後にウォレットからトランザクションを送信します。これでconsoleに結果が出てきたら送金完了です。

wallet.sendTransaction(tx).then((txResult) => {
  console.log(txResult);
});

参考資料

トランザクションの仕組み -GMO

https://recruit.gmo.jp/engineer/jisedai/blog/reentrancy-and-verification-tool/

Ethers.jsから送金の仕組み -Qitta

https://qiita.com/hm0429/items/082ad6ef5749e984d904

Ethers.jsから送金の仕組み -medium

https://yuyasugano.medium.com/フラッシュローンで-dex-アービトラージをやってみる-自動化-9a877e34faa3

JsonRpcProviderの仕組み -ethers.js公式ドキュメント

https://docs.ethers.io/v5/api/providers/jsonrpc-provider/#JsonRpcProvider

Discussion