일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 러스트 기초
- ethers
- ethers type
- 스마트컨트렉트프록시
- ethers websocket
- Vue.js
- 스마트컨트렉트테스트
- 오블완
- 티스토리챌린지
- 머신러닝기초
- 컨트렉트 동일한 함수이름 호출
- 러스트 기초 학습
- ethers typescript
- ethers v6
- 프록시배포구조
- 스마트컨트렉트 함수이름 중복 호출
- multicall
- 스마트 컨트렉트 함수이름 중복
- Vue
- 러스트기초
- 컨트렉트 배포 자동화
- nest.js설명
- chainlink 설명
- ambiguous function description
- SBT표준
- git rebase
- 체인의정석
- 스마트컨트렉트 예약어 함수이름 중복
- vue기초
- rust 기초
- Today
- Total
체인의정석
Lens, Gateway 등 조회 컨트렉트를 만들 때의 유의점 본문
상황 : nft의 홀더리스트 조회를 백엔드 작업 없이 정확하게 리턴하도록 nftFactory에서 리스트를 가져와서 nft 주소를 입력하면 누가 어떤 tokenID를 가지고 있는지 구현한 상황
문제 : 한 홀더당 가지고 있는 nft의 수가 6500개가 넘어가면 (조회함수에서 리턴하는 배열에 6500개 이상의 데이터가 들어갈 시) 오류 발생, 여러 컨트렉트 동시 조회 시에는 이중 배열을 사용하여 100개가 넘는 종류의 nft를 가지고 잇을시 오류 발생.
요약 : 조회함수를 쓰더라도 몇개의 데이터까지 다룰 수 있는지 테스트 필요. 조회 함수더라도 네트워크에 따라서 연산 가능한 양과 인출 가능한 데이터가 다르며 생각보다 그 값은 크지 않음.
해결 방안 : 유저리스트, nft정보 조회를 조회 컨트렉트로 따로 파서 만들 시에는 페이징 함수를 추가하거나 아니면 컨트렉트 단에서 조회함수를 가져온 후 백엔드에서 멀티콜을 써서 따로 구현을 하는 것이 가장 좋음.
활용 방안 : 백엔드가 따로 있더라도 페이징을 넣어서 검산용으로 조회 컨트렉트를 사용하면 좋을 것으로 예상. 실시간성을 강하게 요구하거나 복잡한 컨트렉트 계산이라면 컨트렉트에서 페이징 기능을 넣은 후에 백엔드에서 페이징을 해주는 로직을 만들도록 구현가능. 다만 현재의 상황에서는 단순히 특정 계정이 들고있는 nft리스트를 뽑아내는 것이였기에 백엔드 로직이 더 간단하다고 판단.
컨트렉트 조회 함수 부하 테스트 시 사용한 batch Mint에 대한 병렬 처리 로직
async function parallelMint(accountAddress: string, batches: number, mintsPerBatch: number) {
let promises = [];
for (let i = 0; i < batches; i++) {
const promise = ContractName.batchMint(accountAddress, mintsPerBatch)
.then(tx => console.log(`Batch ${i + 1}: Transaction sent with hash ${tx.hash}`))
.catch(error => console.error(`Batch ${i + 1}: Error minting - ${error.message}`));
promises.push(promise);
}
// Wait for all the promises to resolve
await Promise.all(promises);
console.log('All minting transactions have been sent.');
}
await parallelMint(account1.address, 20, 250);
* 부하테스트시에는 Promise.all을 안쓰면 너무 시간이 오래걸리므로 사용하여 실행.
'블록체인 > Solidity' 카테고리의 다른 글
다양한 체인에 동일한 주소로 배포가 가능한 Create3 자세히 살펴보기 (1) | 2024.07.02 |
---|---|
[솔리디티 오버로딩 함수 호출 방법] & 솔리디티 오버로딩에 대한 에러Solidity TypeError: ambiguous function description (i.e. matches 및 해결 방안 (0) | 2024.05.07 |
ERC721,1155 receiver (0) | 2024.04.05 |
create2 & create3에서의 Owner msg.sender 처리 (0) | 2024.03.28 |
Solidity에서 bytes, bytes32 console.log로 찍는법 (0) | 2024.02.26 |