일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Vue.js
- nest.js설명
- rust 기초
- 오블완
- 프록시배포구조
- git rebase
- 러스트기초
- 스마트컨트렉트테스트
- ethers websocket
- multicall
- ethers v6
- ethers type
- chainlink 설명
- 체인의정석
- 스마트컨트렉트프록시
- ethers typescript
- Vue
- 티스토리챌린지
- 컨트렉트 배포 자동화
- vue기초
- 러스트 기초
- SBT표준
- ethers
- 러스트 기초 학습
- 스마트컨트렉트 함수이름 중복 호출
- 컨트렉트 동일한 함수이름 호출
- ambiguous function description
- 스마트컨트렉트 예약어 함수이름 중복
- 스마트 컨트렉트 함수이름 중복
- 머신러닝기초
Archives
- Today
- Total
체인의정석
hardhat, ethers 테스트 코드 스크립트로 바꾸는 법 (여러 지갑주소로 서명하는 스크립트 만드는법) 본문
블록체인/Ethers & web3
hardhat, ethers 테스트 코드 스크립트로 바꾸는 법 (여러 지갑주소로 서명하는 스크립트 만드는법)
체인의정석 2023. 3. 11. 12:18728x90
반응형
그동안 테스트 코드에서만 여러 지갑 주소를 사용하다가
스크립트에 직접 사용하면 어떻게 해야 할지 찾아봤다.
먼저 config에 프라이빗 키를 배열 형태로 설정해준다.
goerli: {
url: process.env.RPC_URL,
accounts: [process.env.PRIVATE_KEY!, process.env.TEST_PRIVATE_KEY!]
},
matic: {
url: process.env.RPC_URL_MATIC,
accounts: [process.env.PRIVATE_KEY!, process.env.TEST_PRIVATE_KEY!]
},
bsc: {
url: process.env.RPC_URL_BSC,
accounts: [process.env.PRIVATE_KEY!, process.env.TEST_PRIVATE_KEY!]
},
klaytn: {
url: process.env.RPC_URL_KLAYTN,
accounts: [process.env.PRIVATE_KEY!, process.env.TEST_PRIVATE_KEY!]
}
이렇게 되고 나면
import { ethers } from "hardhat";
async function main() {
const accounts = await ethers.getSigners();
for (const account of accounts) {
console.log("account >>", account.address)
}
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
이렇게 스크립트를 만들게 되면 이를 이용해서 여러 지갑주소로 서명하는 실제 네트워크의 서명 스크립트를 만들 수 있습니다.
hyunkicho@Hyunkiui-MacBookPro tutorial_hardhat % npx hardhat run scripts/getSinger.ts --network bsc
account >> 0x3F8bE5375B82390d09E3fF60835eafb162bfeDcc
account >> 0x8Ce636aF0417a1d368FE9e36eC8c7B91cBAD517e
요런 식으로 주소들이 나오게 되고
address를 뺀 다음에 connect를 쓰면 실제로 함수가 실행되게 된다.
그럼 테스트코드를 실제 스크립트로 이식해보겠다.
먼저 테스트코드는
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
import { expect } from "chai";
import { ethers } from "hardhat";
import { EtherStore } from '../typechain-types/contracts/EtherStore.sol/EtherStore';
import { Contract } from 'ethers';
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers';
describe("etherStore", function () {
// We define a fixture to reuse the same setup in every test.
// We use loadFixture to run this setup once, snapshot that state,
// and reset Hardhat Network to that snapshot in every test.
let etherStore: Contract;
let attack: Contract
let eve: SignerWithAddress;
let alice: SignerWithAddress;
let bob: SignerWithAddress;
let owner: SignerWithAddress;
describe("etherStore", function () {
it("Deposit 1 Ether each from Account 1 (Alice) and Account 2 (Bob) into etherStore", async function () {
[owner, alice, bob, eve] = await ethers.getSigners();
const EtherStore = await ethers.getContractFactory("EtherStore");
etherStore = await EtherStore.deploy();
const Attack = await ethers.getContractFactory("Attack");
attack = await Attack.deploy(etherStore.address);
await etherStore.connect(alice).deposit({value: (1*(10**18)).toString()});
await etherStore.connect(bob).deposit({value: (1*(10**18)).toString()});
console.log("etherStore balance : ", await ethers.provider.getBalance(etherStore.address))
});
it("Call Attack.attack sending 1 ether (using Account 3 (Eve))", async function () {
console.log("before sending1 eth : ", await attack.getBalance());
console.log("before sending1 eth attack: ", await ethers.provider.getBalance(attack.address))
console.log("before sending1 eth eve : ", await ethers.provider.getBalance(eve.address))
console.log("etherStore balance etherStore: ", await ethers.provider.getBalance(etherStore.address))
attack.connect(eve).attack({value: (1*(10**18)).toString()})
console.log("after sending1 eth : ", await attack.getBalance());
console.log("after sending1 eth : attack ", await ethers.provider.getBalance(attack.address))
console.log("after sending1 eth : eve ", await ethers.provider.getBalance(eve.address))
console.log("etherStore balance : etherStore", await ethers.provider.getBalance(etherStore.address))
});
});
});
요 부분이다. 재진입 공격 테스트코드이다.
이를 스크립트로 바꾸면
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
import { expect } from "chai";
import { ethers } from "hardhat";
import { EtherStore } from '../typechain-types/contracts/EtherStore.sol/EtherStore';
import { Contract } from 'ethers';
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers';
describe("etherStore", function () {
// We define a fixture to reuse the same setup in every test.
// We use loadFixture to run this setup once, snapshot that state,
// and reset Hardhat Network to that snapshot in every test.
let etherStore: Contract;
let attack: Contract
let eve: SignerWithAddress;
let alice: SignerWithAddress;
let bob: SignerWithAddress;
let owner: SignerWithAddress;
describe("etherStore", function () {
it("Deposit 1 Ether each from Account 1 (Alice) and Account 2 (Bob) into etherStore", async function () {
[owner, alice, bob, eve] = await ethers.getSigners();
const EtherStore = await ethers.getContractFactory("EtherStore");
etherStore = await EtherStore.deploy();
const Attack = await ethers.getContractFactory("Attack");
attack = await Attack.deploy(etherStore.address);
await etherStore.connect(alice).deposit({value: (1*(10**18)).toString()});
await etherStore.connect(bob).deposit({value: (1*(10**18)).toString()});
console.log("etherStore balance : ", await ethers.provider.getBalance(etherStore.address))
});
it("Call Attack.attack sending 1 ether (using Account 3 (Eve))", async function () {
console.log("before sending1 eth : ", await attack.getBalance());
console.log("before sending1 eth attack: ", await ethers.provider.getBalance(attack.address))
console.log("before sending1 eth eve : ", await ethers.provider.getBalance(eve.address))
console.log("etherStore balance etherStore: ", await ethers.provider.getBalance(etherStore.address))
attack.connect(eve).attack({value: (1*(10**18)).toString()})
console.log("after sending1 eth : ", await attack.getBalance());
console.log("after sending1 eth : attack ", await ethers.provider.getBalance(attack.address))
console.log("after sending1 eth : eve ", await ethers.provider.getBalance(eve.address))
console.log("etherStore balance : etherStore", await ethers.provider.getBalance(etherStore.address))
});
});
});
이렇게 되고 그에 따른 결과는
hyunkicho@Hyunkiui-MacBookPro tutorial_hardhat % npx hardhat run scripts/deposit.ts --network local
etherStore balance : BigNumber { value: "2000000000000000000" }
before sending1 eth : BigNumber { value: "0" }
before sending1 eth attack: BigNumber { value: "0" }
before sending1 eth eve : BigNumber { value: "100000000000000000000" }
etherStore balance etherStore: BigNumber { value: "2000000000000000000" }
after sending1 eth : BigNumber { value: "0" }
after sending1 eth : attack BigNumber { value: "0" }
after sending1 eth : eve BigNumber { value: "98998550680000000000" }
etherStore balance : etherStore BigNumber { value: "0" }
hyunkicho@Hyunkiui-MacBookPro tutorial_hardhat % npx hardhat run scripts/deposit.ts --network klaytn
etherStore balance : BigNumber { value: "2000000000000000000" }
before sending1 eth : BigNumber { value: "0" }
before sending1 eth attack: BigNumber { value: "0" }
before sending1 eth eve : BigNumber { value: "99999475000000000000" }
etherStore balance etherStore: BigNumber { value: "2000000000000000000" }
after sending1 eth : BigNumber { value: "0" }
after sending1 eth : attack BigNumber { value: "0" }
after sending1 eth : eve BigNumber { value: "99999475000000000000" }
etherStore balance : etherStore BigNumber { value: "2000000000000000000" }
결과가 잘 나왔습니다.
테스트 코드가 이상해서 다시 한건데 그 이유는 이더리움 잔고의 경우 업데이트를 하고 다음 블록에서 조회를 해야 조회가 되는것 같습니다.
728x90
반응형
'블록체인 > Ethers & web3' 카테고리의 다른 글
ethers, hardhat 환경에서 이벤트를 통한 대용량 토큰 스냅샷 처리 프로그램 제작하기 (엑셀파일로 스냅샷 만들기) (0) | 2023.03.16 |
---|---|
큰 규모의 서비스에서의 백엔드 최적화 방안들 (0) | 2023.03.16 |
hardhat 환경에서 잘 작동하지 않는 benchmark와 그에 대한 해결 방안 (0) | 2023.02.21 |
ethers에 typescript 제대로 적용해보기 (0) | 2023.01.06 |
Typescript에서 hardhat 사용하기 - task 사용하는법, config파일 밖으로 꺼내서 코드 가독성 높이는 법 (0) | 2022.12.16 |
Comments