如何通过HardHat获取底层合约地址的私钥?

How can I get the private key of the address of the underlying contract through HardHat?

我有来自 HardHat 教程的智能合约 https://hardhat.org/tutorial/writing-and-compiling-contracts.html

我成功部署了它。

async function main() {
  const [deployer] = await ethers.getSigners();

  console.log("Deploying contracts with the account:", deployer.address);

  console.log("Account balance:", (await deployer.getBalance()).toString());

  const Token = await ethers.getContractFactory("Token");
  const token = await Token.deploy();

  console.log("Token address:", token.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

但是只有联系人的地址返回给我,私钥没有。

  console.log("Deploying contracts with the account:", deployer.address);

这种方式如何获取私钥? 我需要它用于方法

web3.eth.accounts.wallet.add('0x<private_key>');

否则我无法在智能合约上调用转账方法。

设计上不可能。

合约地址由部署交易参数决定。具体来说,ethers deploy() 函数默认使用 CREATE 操作码,因此合约地址由部署者地址和部署交易 nonce 参数决定。

但合约地址的私钥在部署期间从未生成 - 因此无法返回。只是地址。


Because otherwise I can't call the transfer method on the smart contract.

正确。如果你想从合约中转出资金,你需要实现一个功能才能做到这一点。

pragma solidity ^0.8;

contract MyContract {

    // transfers the entire balance of this contract to the `msg.sender`
    function widthdraw() external {
        require(msg.sender == address(0x123), "Not authorized");
        payable(msg.sender).transfer(address(this).balance);
    }
}

假设你知道私钥,并且你制定了借贷智能合约,每个人都可以将他们的钱集中在合约上并从合约中借钱。 有一天你贪心了,你就用你的私钥把所有的池子都转到你的私人钱包里了。 这听起来不错吗?按照设计,即使是部署者也不应该访问合同的私钥,这就是以太坊、dapp 和 dao 的意义所在,没有它,基本上部署者仍然是控制一切的“中心”。