Hardhat-deploy: Dukungan untuk dompet perangkat keras?

Dibuat pada 26 Mar 2021  ·  20Komentar  ·  Sumber: wighawag/hardhat-deploy

Halo! Kami berharap untuk mengintegrasikan hardhat-deploy ke https://github.com/ethereum-optimism/contracts. Kami idealnya menginginkan dukungan untuk penerapan dari dompet perangkat keras. Ini bukan pemblokir untuk menggunakan hardhat-deploy tetapi pasti akan membantu dalam jangka panjang. Apakah ini mungkin sekarang? Jika tidak, apakah ini sesuatu yang dapat dibantu oleh tim Optimism?

enhancement

Komentar yang paling membantu

Saya pikir solusi awal yang diusulkan oleh @smartcontracts adalah yang paling elegan:

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

Apakah ada masalah terbuka di hardhat? Saya akan senang untuk melihat penerapan ini

Semua 20 komentar

Hai @smartcontracts ini jelas merupakan fitur yang ingin saya miliki sendiri.

Saya dapat melihat 3 opsi:

  1. Salah satu kemungkinan adalah menambahkan metode deployContract ke hardhat-deploy-ethers yang memungkinkan Anda melewati penanda tangan eter (lihat PR ini yang bertujuan untuk melakukannya di hardhat-deploy itu sendiri: https://github.com/wighawag/hardhat- menyebarkan/menarik/62). Tetapi sebagai pengguna hardhat-deploy, ini bukan yang paling elegan karena Anda perlu membuat instance penanda tangan, dll...

  2. Saya berharap ini bisa dilakukan di tingkat hardhat dan mungkin saja dengan mengesampingkan penyedia hardhat.
    Dengan cara ini tidak hanya hardhat-deploy yang dapat mengambil manfaat tetapi setiap plugin dan kasus penggunaan lainnya.

  3. Jika tidak, menjadikannya sebagai bagian dari hardhat-deploy bisa berhasil. Saya hanya perlu mencari tahu bagaimana ini akan dikonfigurasi.
    Saat ini hardhat-deploy memungkinkan Anda memberi nama akun dan akun ini hanyalah alamat sebagai string.
    Anda meneruskan string itu seperti di bidang from .
    Dengan mengingat hal itu, mungkin yang paling sederhana adalah mengubah bidang from menjadi string atau objek. dan objek dapat menentukan opsi apakah itu dompet perangkat keras atau bukan.
    Tetapi idealnya saya ingin ini dapat dikonfigurasi melalui akun yang disebutkan. sayangnya, struktur akun bernama saat ini tidak membuatnya mudah. Satu ide adalah menambahkan string alamat dengan beberapa string protokol, seperti " ledger://0x34fe4ff... "

Sangat menarik. Reaksi awal saya adalah bahwa (idealnya) plugin tidak perlu peduli apakah penandatangan adalah kunci pribadi teks biasa atau dompet perangkat keras. Mungkin kita dapat membuat plugin terpisah yang memungkinkan seseorang untuk menentukan koneksi dompet perangkat keras di bidang accounts dari konfigurasi jaringan hardhat. Kemudian kita bisa menerjemahkannya ke dalam LedgerSigner (sepertinya belum ada dukungan eter Trezor). Lihat contoh di bawah ini:

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

Ya, itu cara terbaik menurut saya. Memilikinya sebagai level serendah mungkin

Satu masalah yang saya lihat adalah dompet perangkat keras tidak mengekspos alamat tanpa konfirmasi, jadi setiap plugin, alat yang mengambil daftar akun akan meminta masukan pengguna di dompet, tidak ideal.

Jadi mungkin objek akun harus menentukan alamatnya dan jika itu benar-benar tidak cocok maka itu kesalahan, atau sesuatu

Jadi mungkin objek akun harus menentukan alamatnya dan jika itu benar-benar tidak cocok maka itu kesalahan, atau sesuatu

Saya pikir ini adalah cara yang tepat untuk melakukannya. Saya akan bereksperimen dengan ini besok dan melihat apakah saya bisa membuatnya relatif dapat diandalkan.

Apakah Anda mencari bantuan untuk masalah lain? akan dengan senang hati membantu di mana saya bisa

Tidak sekarang, tetapi ingin mendengar tentang fitur yang hilang, dan saya siap untuk mendiskusikannya seperti ini untuk cara terbaik ke depan :)

Saya sedang bereksperimen dengan ini sekarang. Sayangnya, cukup sulit untuk melakukan ini pada level yang lebih rendah di hardhat. Solusi sementara yang mudah adalah hardhat-deploy untuk mengizinkan penerusan penandatangan ke deploy bukan hanya alamat. Bagaimana perasaan Anda tentang itu? Itu akan memungkinkan kita untuk melakukan sesuatu di sepanjang baris:

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

Hai @smartcontracts , periksa jawaban saya di sini: https://github.com/wighawag/hardhat-deploy/pull/62
Pada dasarnya saya ingin menjaga hardhat-deploy independen dari eter atau perpustakaan lain di sisi API.

Tetapi seperti yang disebutkan dalam balasan saya di sana, ini dapat ditambahkan melalui hardhat-deploy-ethers : https://github.com/wighawag/hardhat-deploy-ethers

Seberapa mendesak Anda membutuhkan sesuatu seperti ini?

Hai @smartcontracts Saya menambahkan dukungan untuk buku besar pada versi terbaru (0.7.0-beta.51)

Tidak dapat menguji banyak karena dukungan buku besar tampaknya cukup bermasalah (mungkin terkait dengan ini: https://github.com/ethers-io/ethers.js/issues/1203). tapi mungkin Anda akan memiliki kesempatan yang lebih baik dari saya.

Saya menggunakan opsi 3 yang cukup mudah untuk ditambahkan. Anda pada dasarnya menambahkan akun bernama dengan nilai seperti ledger://<address> lihat misalnya di sini: https://github.com/wighawag/template-ethereum-contracts/blob/d7eee3fc00b7e6a347a5ef2cd7718998254f2401/hardhat.config.ts#L15

hardhat-deploy mengonversinya ke alamat sehingga Anda masih dapat merujuk ke akun bernama ini sebagai alamat, tetapi di balik layar itu mengaitkan akun itu ke LedgerSigner. Saya juga menambahkan log ketika dompet perangkat keras terdeteksi/.

Sampai sebuah plugin untuk hardhat dapat menanganinya pada level rendah, ini seharusnya cukup baik untuk sebagian besar kasus penggunaan. Biarkan aku tahu apa yang kamu pikirkan

Ini fantastis. Mengujinya sekarang!

Tampaknya berfungsi untuk satu transaksi tetapi kemudian mengalami semacam crash. Sepertinya paket buku besar eter agak rusak.

@wighawag senang melihat dukungan buku besar segera hadir. Saya hanya ingin memberi tahu Anda bahwa untuk proyek saya, saya melakukan beberapa perbaikan dan tampaknya berhasil untuk beberapa penerapan saya. Inilah perbedaan

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 Saya dapat mengirim PR jika Anda dapat mengarahkan saya ke arah yang benar untuk melakukan perbaikan dengan cara yang benar, perbaikan saya bukanlah sesuatu yang akan masuk PR ;P

Terima kasih @rokso, saya akan melihatnya.
Perhatikan bahwa versi terakhir dari paket dompet perangkat keras eters.js mungkin tetap dapat memperbaiki masalah.

@wighawag Tidak yakin bagaimana ethers.js akan memperbaikinya, karena kita harus memanggil close secara eksplisit. ethers.js dapat membantu dengan mengekspos metode close

@rokso melihat perbedaannya, Anda menutup setelah setiap penerapan.
eters.js dapat melakukan hal yang sama pada level tx

@wighawag ya itu berfungsi tetapi pengguna akan membuka koneksi baru untuk setiap transaksi. Solusi ini akan bekerja untuk kasus kami saat kami membuka koneksi baru.

Saya pikir solusi awal yang diusulkan oleh @smartcontracts adalah yang paling elegan:

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

Apakah ada masalah terbuka di hardhat? Saya akan senang untuk melihat penerapan ini

Hai semua, hanya ingin memeriksa status ini. Apakah ini sudah terpecahkan? Saya mengalami kesalahan ini secara lokal: /bindings.js:126 err = new Error( ^ Error: Could not locate the bindings file. Tried: saat mencoba pengaturan yang menggunakan ' ledger://0x00000000000000addr00000 ' dalam namedAccounts dari konfigurasi.

Saya rasa paket dompet perangkat keras eter belum menyelesaikan masalahnya: https://github.com/ethers-io/ethers.js/issues/1440#issuecomment -816554584

Apakah halaman ini membantu?
0 / 5 - 0 peringkat