본문 바로가기

반응형

블록체인

(20)
팬텀 지갑의 get cluster 지금까지의 결론: 팬텀 지갑이 어떤 네트워크에 접속되어있는지 알 수 없다. 메타마스트의 경우에는 isMetamask, 그리고 chainId 를 window.ethereum 객체를 통해 조회할 수 있다. 하지만 팬텀의 경우에는 window.solana 에서 isPhantom 은 제공하지만 chainId 처럼 연결된 cluster 정보는 제공하지 않는다. 팬텀 지갑에서 연결된 네트워크를 설정하면, 지갑 어플 내에서 변수로 관리하는 것 같고 explorer.solana.com 와 같은 사이트도 devnet/mainnet 설정 버튼을 누르면 cluster 를 선택할 수 있다. 다만 사이트에서 설정한 cluster 와 팬텀 지갑에 설정한 cluster 의 차이가 있을 때, 팬텀에서 이를 감지하지 않는다. "Tra..
보안취약점 external call 솔리디티 스마트 컨트랙트에서 external call 을 할 때 (예를 들면 safeMint 함수) 호출한 외부 함수에서 나의 함수를 재호출하는 위험이 있다. 이를 방지하기 위해 우선적으로는 require 문에서 권한 또는 정보의 유효성을 체크할 수 있다. 다만 함수 내에서 실행하는 로직에 의해 require 문 만족 여부가 바뀌는 경우가 있을 수 있다. 따라서 함수 내에서 변경하고자 하는 값이 있다면 external call 을 요청하기 전에 모두 실행해야 한다. 결론: external call 의 위치 함수의 끝에 작성하도록 한다.
web3 개발 애러 처리 솔라나 web3 개발을 하면서 소스코드상 어떻게 예외처리 로직을 짜야 좋은지 고민하게 된다. web3 호출에 대한 다양한 에러가 발생할 수 있는데, 1. 입력값을 내가 직접 필터링할 수도 있고 2. web3 호출의 에러 리턴 값을 try-catch 문으로 파싱해줄 수도 있다. 내가 직접 필터링하는 방법 장점 다양한 테스트케이스에 대해 생각해볼 수 있다. 에러를 직접 처리하는 과정에서 사용하는 web3 함수들과 친해질 수 있다. 직접 작성하여 정확한 에러 메세지를 리턴해줄 수 있다. 단점 소스코드가 복잡해진다. if-else 문이 중첩될 수 있다. web3 호출 에러를 리턴하는 방법 장점 불필요한 web3 호출을 줄여 함수 실행 속도를 개선한다. 에러 메세지를 파싱하기 위한 글로벌 핸들러를 개발할 수 있다..
팬텀 지갑 제공 정보 Metamask 연결시 연결된 네트워크를 확인할 수 있다. (mainnet-beta, rinkeby 등등...) window.ethereum.chainId '0x1' 솔라나 팬텀 지갑에서는 이런 기능이 없다. 보통 solana-web3 개발할 때 isConnected 또는 isPhantom 정도는 확인하지만 어떤 네트워크에 현재 팬텀이 접속되어있는지는 web3 코드로 분별할 수 없다. 이 검증을 하기 위해 오픈씨에서는 웹을 어떻게 구현했는지 확인해보았다. 링크비 네트워크에 현재 접속되어있다는 warning 이 표시된다. NFT 구매 요청을 하면 네트워크를 변경하라는 팝업이 뜬다. 그 팝업으로 인해 메타마스크에 네트워크 변경 요청도 호출할 수 있다. 반면 솔라나에서는 팬텀 지갑이 devnet..
프론트에서 서버로 보내는 요청을 최소화 하라 CoinMarketCap 처럼 방대한 정보를 보여는 사이트의 개발자 도구를 열어보면 http 요청은 로그인을 위해 한번만 발생한다. 나머지는 웹소켓을 통해 주기적으로 데이터를 받아온다. 소켓 관리에 대한 로드가 발생하겠지만 생각해보면 이렇게 하는 방식이 옳다. 예를들어 프론트에서 join 된 정보가 필요하다면 서버에서 한번만 실행하고 1000 개의 클라이언트에게 보내는 방식이 http 요청에 의해 1000번 수행하는 것보다 낫다.
서명 검증 함수 소개 솔라나 web3 개발 중에 키페어로 서버에서 서명하는 경우는 다음과 같은 코드를 활용한다. const keypair = Keypair.generate(); let tx = new Transaction(); tx.sign(keypair); keypair 객체는 public key / secret key 정보가 모두 있어 트랜잭션에 대한 서명을 만들 수 있다. 또는 Transaction 객체의 sign() 함수 대신 addSignature() 를 사용한다면 다음처럼 tweetnacl 함수를 사용해야 한다. const keypair = Keypair.generate(); let tx = new Transaction(); const buffer = tx.serializeMessage(); const signat..
[beet FixableBeetStruct.deserialize 에러]"offset" is out of range @metaplex-foundation/mpl-token-metadata 패키지의 Metadata.fromAccountInfo(accountInfo, 0)[0] 코드를 활용하던 중에 다음과 같은 에러가 발생했다. [Nest] 19781 - 05/18/2022, 3:26:17 PM ERROR [ExceptionsHandler] The value of "offset" is out of range. It must be >= 0 and = 0 and 33 -> 65 식으로 증가하다가 말도안되게 큰 값인 1653705784 로 설정되면서 Buffer 에서 수용 가능한 offset 을 초과하여 애러가 발생했다. 솔라나의 모든 PubKey 는 같은 SystemProgram 에 의해 생성되지만 어떤 프로그램에게 전가된 ..
sendAndConfirmTransaction 서명 오류 Transaction 객체를 생성하고 Keypair 객체를 제공하면, sendAndConfirmTransaction 함수를 통해 서명과 동시에 전송이 된다. HSM 처럼 개인키를 네트워크에 전송하지 못하는 경우에는 솔라나 서명 알고리즘 (Ed25519) 를 제공하는 tweetnacl 패키지를 통해서 서버사이드에서 서명하여 raw transaction 에 signature 를 동봉하여 보내게 된다. 이 때 사용하는 함수는 web3 의 sendAndConfirmRawTransaction 이다. 서명 오류 [Nest] 13400 - 05/16/2022, 6:16:46 PM ERROR [ExceptionsHandler] Signature verification failed Error: Signature veri..