Hardhat-deploy: Поддержка аппаратных кошельков?

Созданный на 26 мар. 2021  ·  20Комментарии  ·  Источник: wighawag/hardhat-deploy

Привет! Мы надеемся интегрировать hardhat-deploy в https://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. Одна из возможностей - добавить метод deployContract в hardhat-deploy-ethers , который позволит вам передать подписывающего ethers (см. Этот PR, который был нацелен на это в самом hardhat-deploy: https://github.com/wighawag/hardhat- развернуть / тянуть / 62). Но для пользователей, использующих hardhat-deploy, это не самый элегантный вариант, поскольку вам нужно создать экземпляр подписывающей стороны и т. Д.

  2. Я надеялся, что это можно сделать на уровне каски, и это вполне возможно, переопределив провайдера каски.
    Таким образом может выиграть не только hardhat-deploy, но и любой другой плагин и варианты использования.

  3. В противном случае можно было бы сделать это как часть hardhat-deploy. Мне просто нужно выяснить, как это будет настроено.
    В настоящее время hardhat-deploy позволяет вам давать имена учетным записям, и эти учетные записи представляют собой просто адреса в виде строк.
    вы передаете эту строку как в поле from .
    Имея это в виду, возможно, самым простым было бы изменить поле from на строку или объект. и объект может указывать параметры, является ли это аппаратным кошельком или нет.
    Но в идеале я бы хотел, чтобы это можно было настраивать с помощью названных учетных записей. К сожалению, текущая именованная структура учетной записи не упрощает эту задачу. Одна из идей заключалась в том, чтобы добавить к адресной строке некоторую строку протокола, например " ledger: // 0x34fe4ff ... "

Очень интересно. Моя первоначальная реакция такова, что (в идеале) плагины не должны заботиться о том, является ли подписывающая сторона закрытым ключом в виде открытого текста или аппаратным кошельком. Возможно, мы могли бы создать отдельный плагин, который позволит указать соединение с аппаратным кошельком в поле accounts конфигурации сети hardhat. Затем мы могли бы перевести его в LedgerSigner (похоже, эфиры Trezor еще не поддерживаются). См. Пример ниже:

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

Да, я думаю, так было бы лучше всего. Имея это как можно более низкий уровень

Одна проблема, которую я вижу, заключается в том, что аппаратный кошелек не раскрывает адрес без подтверждения, поэтому каждый плагин, инструмент, который извлекает список учетных записей, будет запрашивать ввод пользователя в кошелек, что не идеально.

Так что, возможно, объект учетной записи должен указать адрес, и если он на самом деле не совпадает, он выдает ошибку или что-то в этом роде

Так что, возможно, объект учетной записи должен указать адрес, и если он на самом деле не совпадает, он выдает ошибку или что-то в этом роде

Я считаю, что это правильный способ сделать это. Я поэкспериментирую с этим завтра и посмотрю, смогу ли я сделать его относительно надежным.

Вам нужна помощь по другим вопросам? был бы рад помочь, где смогу

Не сейчас, но очень хочу услышать об отсутствующих функциях, и я готов обсудить это, как этот, для лучшего пути вперед :)

Я сейчас экспериментирую с этим. К сожалению, сделать это на более низком уровне в hardhat довольно сложно. Простым временным решением было бы, если бы 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://github.com/wighawag/hardhat-deploy/pull/62
В основном я хочу, чтобы hardhat-deploy не зависел от эфиров или любой другой библиотеки на стороне API.

Но, как упоминалось в моем ответе, это можно добавить через hardhat-deploy-ethers : https://github.com/wighawag/hardhat-deploy-ethers

Насколько срочно вам нужно что-то подобное?

Привет, @smartcontracts, я добавил поддержку бухгалтерской книги в последней версии (0.7.0-beta.51)

Не удалось протестировать много, так как поддержка леджера кажется довольно глючной (возможно, связано с этим: https://github.com/ethers-io/ethers.js/issues/1203). Но, может быть, у тебя будет больше шансов, чем у меня.

Я использовал вариант 3, который было довольно легко добавить. вы в основном добавляете именованную учетную запись со значением вроде ledger://<address> например, см. здесь: https://github.com/wighawag/template-ethereum-contracts/blob/d7eee3fc00b7e6a347a5ef2cd7718998254f2401/hardhat.config.ts#L15

hardhat-deploy преобразует это в адрес, чтобы вы по-прежнему могли ссылаться на эту именованную учетную запись как на адрес, но за сценой он связывает эту учетную запись с LedgerSigner. Я также добавил журнал при обнаружении аппаратного кошелька /.

Пока плагин для каски не сможет справиться с этим на низком уровне, этого должно быть достаточно для большинства случаев использования. Дайте мне знать, что вы думаете

Это фантастика. Тестирую сейчас!

Казалось, работает для одной транзакции, но потом произошел какой-то сбой. Кажется, пакет эфирной книги немного сломан.

@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 Я могу отправить PR, если вы можете указать мне правильное направление, чтобы сделать исправление правильным способом, мое исправление не то, что войдет в PR; P

Спасибо @rokso, я посмотрю.
Обратите внимание, что последняя версия пакета hardhware-wallet ethers.js все равно может решить проблему.

@wighawag Не уверен, как ethers.js это исправит, так как нам придется явно вызвать close . 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"
        }
      ],
    }
  }
}

Есть ли открытый вопрос по каске? Я был бы рад взглянуть на реализацию этого

Привет всем, просто хотел проверить статус этого. Это было решено? Я столкнулся с этой ошибкой локально: /bindings.js:126 err = new Error( ^ Error: Could not locate the bindings file. Tried: при попытке настройки, которая использует ' ledger: // 0x00000000000000addr00000 ' в namedAccounts конфигурации.

Я не думаю, что пакет аппаратного кошелька ethers решил свои проблемы: https://github.com/ethers-io/ethers.js/issues/1440#issuecomment -816554584

Была ли эта страница полезной?
0 / 5 - 0 рейтинги