Hardhat-deploy: ハードウェアウォレットのサポート?

作成日 2021年03月26日  ·  20コメント  ·  ソース: wighawag/hardhat-deploy

こんにちは! hardhat-deployhttps://github.com/ethereum-optimism/contractsに統合したいと考えていhardhat-deployを使用するためのブロッカーではありませんが、長期的には間違いなく役立ちます。 これは今のところ可能ですか? そうでない場合、これは楽観主義チームが支援できるものですか?

enhancement

最も参考になるコメント

@smartcontractsによって提案された最初のソリューションが最もエレガントだと思います。

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

ヘルメットに未解決の問題はありますか? これを実装してみてうれしいです

全てのコメント20件

ねえ@smartcontractsこれは間違いなく私が自分で持っていたい機能です。

私は3つのオプションを見ることができます:

  1. 1つの可能性は、deployContractメソッドをhardhat-deploy-ethersに追加して、ethers署名者を渡すことです(hardhatでそれを行うことを目的としたこのPRを参照してください-それ自体をデプロイします:https://github.com/wighawag/hardhat-デプロイ/プル/ 62)。 しかし、ハードハット展開ユーザーとして、これは署名者などをインスタンス化する必要があるため、最もエレガントではありません...

  2. 私はこれがハードハットレベルで実行できることを望んでいました。ハードハットプロバイダーをオーバーライドすることで可能になるかもしれません。
    このようにして、hardhat-deployだけでなく、他のすべてのプラグインとユースケースにもメリットがあります。

  3. それ以外の場合は、hardhat-deployの一部として機能する可能性があります。 これがどのように構成されるかを理解する必要があります。
    現在、hardhat-deployではアカウントに名前を付けることができ、これらのアカウントは単に文字列としてのアドレスです。
    その文字列をそのままfromフィールドに渡します。
    そのことを念頭に置いて、おそらく最も簡単なのは、 fromフィールドを文字列またはオブジェクトに変更することです。 オブジェクトは、ハードウェアウォレットであるかどうかに関係なくオプションを指定できます。
    しかし、理想的には、これを名前付きアカウントを介して構成できるようにしたいと思います。 残念ながら、現在の名前付きアカウント構造では簡単にはできません。 1つのアイデアは、アドレス文字列の前に「元帳:// 0x34fe4ff ... 」などのプロトコル文字列を

とても興味深い。 私の最初の反応は、(理想的には)プラグインは署名者がプレーンテキストの秘密鍵であるかハードウェアウォレットであるかを気にする必要がないということです。 おそらく、ハードウェアネットワーク構成のaccountsフィールドでハードウェアウォレット接続を指定できる別のプラグインを作成できます。 次に、それをLedgerSignerに変換でき

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

はい、それが最善の方法だと思います。 可能な限り最低レベルにする

私が見ることができる問題の1つは、ハードウェアウォレットが確認なしにアドレスを公開しないことです。そのため、アカウントのリストを取得するすべてのプラグイン、ツールは、ウォレットへのユーザー入力を要求しますが、理想的ではありません。

したがって、アカウントオブジェクトでアドレスを指定する必要があり、実際に一致しない場合はエラーになるか、何か

したがって、アカウントオブジェクトでアドレスを指定する必要があり、実際に一致しない場合はエラーになるか、何か

これが正しい方法だと思います。 明日これを試して、比較的信頼できるものが得られるかどうかを確認します。

他の問題について助けを求めていますか? 私ができるところを喜んで手伝ってくれるでしょう

今はありませんが、不足している機能について聞きたいと思っています。今後の最善の方法として、このように話し合うことができます:)

私は今これを実験しています。 残念ながら、これをヘルメットの下位レベルで行うのはかなりの作業です。 簡単な一時的な解決策は、 hardhat-deployを使用して、単なるアドレスではなく、署名者をdeploy渡すことです。 あなたはそれについてどう思いますか? それは私たちが次の線に沿って何かをすることを可能にするでしょう:

const signer = new LedgerSigner(hre.network.provider, 'default', hre.ethers.utils.defaultPath)
const result = await deploy('MyContract', {
  from: signer,
  args: [],
  log: true,
})

ねえ@smartcontracts 、ここで私の答えを確認してください: https
基本的に、私はhardhat-deployをエーテルやAPI側の他のライブラリから独立させたいと思っています。

しかし、そこでの私の返信で述べたように、これはhardhat-deploy-ethers介して追加できます: https

このようなものがどれほど緊急に必要ですか?

ねえ@smartcontracts最新バージョン(0.7.0-beta.51)で元帳のサポートを追加しました

元帳のサポートはかなりバグがあるように見えるため、あまりテストできませんでした(おそらくこれに関連しています:https://github.com/ethers-io/ethers.js/issues/1203)。 でも多分あなたは私よりもチャンスがあるでしょう。

追加が非常に簡単なオプション3を使用しました。 基本的に、 ledger://<address>ような値の名前付きアカウントを追加します。たとえば、 httpsください。

hardhat-deployはそれをアドレスに変換して、この名前付きアカウントをアドレスとして参照できるようにしますが、舞台裏ではそのアカウントをLedgerSignerに関連付けます。 ハードウェアウォレットが検出されたときのログも追加しました/。

ヘルメット用のプラグインが低レベルでそれを処理できるようになるまで、これはほとんどのユースケースに十分なはずです。 どう考えているか教えてください

これは素晴らしいです。 今すぐテストしてください!

1つのトランザクションで機能しているように見えましたが、ある種のクラッシュが発生しました。 エーテル元帳パッケージが少し壊れているようです。

@wighawagは、元帳のサポートが間もなく開始されるのを見るのは素晴らしいことです。 私のプロジェクトではいくつかの修正を行いましたが、これは複数のデプロイメントで機能するようです。 これがdiffです

diff --git a/node_modules/hardhat-deploy/dist/src/helpers.js b/node_modules/hardhat-deploy/dist/src/helpers.js
index 3b588fa..67dce8f 100644
--- a/node_modules/hardhat-deploy/dist/src/helpers.js
+++ b/node_modules/hardhat-deploy/dist/src/helpers.js
@@ -290,6 +290,10 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
         if (options.log || hardwareWallet) {
             print(`: deployed at ${deployment.address} with ${receipt === null || receipt === void 0 ? void 0 : receipt.gasUsed} gas\n`);
         }
+        if(hardwareWallet){
+            const __eth = await ethersSigner._eth
+            await __eth.transport.device.close()
+        }
         return Object.assign(Object.assign({}, deployment), { address, newlyDeployed: true });
     }
     async function deterministic(name, options) {
@@ -396,7 +400,7 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
                 transaction = await provider.getTransaction(deployment.transactionHash);
             }
             if (transaction) {
-                const { ethersSigner } = await getOptionalFrom(options.from);
+                const { ethersSigner, hardwareWallet } = await getOptionalFrom(options.from);
                 const { artifact } = await getArtifactFromOptions(name, options);
                 const abi = artifact.abi;
                 const byteCode = linkLibraries(artifact, options.libraries);
@@ -421,9 +425,17 @@ function addHelpers(deploymentManager, partialExtension, network, getArtifact, s
                             ' not specified in new transaction, cant compare');
                     }
                     if (transaction[field] !== newTransaction[field]) {
+                        if(hardwareWallet){
+                            const __eth = await ethersSigner._eth
+                            await __eth.transport.device.close()
+                        }
                         return { differences: true, address: deployment.address };
                     }
                 }
+                if(hardwareWallet){
+                    const __eth = await ethersSigner._eth
+                    await __eth.transport.device.close()
+                }
                 return { differences: false, address: deployment.address };
             }
         }

@wighawag正しい方法で修正を行うために正しい方向に私を

ありがとう@rokso私は見ていきます。
ただし、後者のバージョンのethers.jshardhware-walletパッケージで問題が修正される可能性があることに注意してください。

@wighawag close明示的に呼び出す必要があるため、ethers.jsがこれをどのように修正するかわかりません。 ethers.jsは、 closeメソッドを公開することで役立ちます

@roksoは差分を見て、デプロイするたびに閉じます。
ethers.jsはtxレベルで同じことを行うことができます

@wighawagええ、それは機能しますが、ユーザーはすべてのトランザクションに対して新しい接続を開く必要があります。 このソリューションは、新しい接続を開いているため、このケースで機能します。

@smartcontractsによって提案された最初のソリューションが最もエレガントだと思います。

const config = {
  networks: {
    goerli: {
      accounts: [
        {
          platform: "ledger",
          type: "hid",
          path: "m/44'/60'/0'/0/0"
        }
      ],
    }
  }
}

ヘルメットに未解決の問題はありますか? これを実装してみてうれしいです

ねえ、これのステータスをチェックしたかっただけです。 これは解決されましたか? ローカルでこのエラーが発生しています:構成のnamedAccounts内で '元帳:// 0x00000000000000addr00000 'を使用するセットアップを試行しているときに/bindings.js:126 err = new Error( ^ Error: Could not locate the bindings file. Tried:

ethersのhardware-walletパッケージでまだ問題が解決されていないと思います: https

このページは役に立ちましたか?
0 / 5 - 0 評価