면접 질문 - 1

Lumi·2022년 2월 23일
0

블록체인 면접 질문

목록 보기
11/11
post-thumbnail

💡 개요

저 뿐만 아니라 다른 분들이 면접을 겪으시면서 질문 받았던 내용에 대한 정리 글 입니다.

이 글에서는 저의 내용보다는 다른분이 질문 받았던 내용으로 구성이 되어있습니다

  • 저도 공부하기 위해서 정리하는 글 입니다.

따로 정답이 있는 것은 아니기 떄문에 제가 이러한 질문을 받았을경우 어떤 방향으로 대답했을지에 대한 글 입니다.

💡 ERC-721에서 모든 토큰에 대한 권하을 한 주소로 한번에 옮기는 방법

이 부분에 대해서 구현을 해본 경험이 없고 따로 이러한 부분이 필요한지에 대해서 따로 고민을 해본적이 없어서 개인적인 의견을 적어보겠습니다.

저는 Auction컨트랙트를 작성해본 경험이 있습니다.

말 그대로 NFT를 거래를 지원해주는 컨트랙트 였으며 이러한 방법과 유사하게 작동시키면 될 것이라고 생각합니다.

NFT컨트랙트를 참고하면 특정 NFT번호와 address값을 묶은 mapping변수가 있습니다.

그러면 이러한 변수를 수정하면 문제 없이 NFT의 소유자가 변경이 되게 될 것입니다.

이떄 저희가 고려해야 하는 부분은 가스비 입니다.

NFT를 하나 옮길떄마다 트랜잭션을 발생시키는 것은 최소 가스비를 고려하지 않는 방법이기 떄문에

MultiCall을 통해서 하나의 함수, 트랜잭션을 통해서 mapping값을 모두 훑어본뒤에 주소를 변경해 주는 방법으로 구동시킬것 같습니다.

  • MultiCall은 주로 화면에 다양한 정보를 보여줄떄 사용하는 방법입니다.
  • 결국 한번에 모든 데이터를 가져오는 방법이라고 생각하면 될것 같습니다.

💡 니모닉 코드 vs 개인키

저만의 언어로 설명을 해보자면 니모닉 코드는 사용자 친화적인 개인키 입니다.

개인키는 해시화한 값으로 구성이 되어있고 사용자 입장에서는 이런 개인키를 기록하고 보관하는 것은 좋은 경험을 주지 않습니다.

왜냐하면 다양한 문자와 숫자로 구성이 되어 있기 때문에 만약 개인키가 틀릴경우 어떤 부분에서 틀렸는지 확인하기가 힘들고 개인적으로 기록하기도 힘들 것 입니다.

그러기 떄문에 사용자들에게 좀더 익숙한 영어단어로 구성된 니모닉코드를 사용 하는 것이고 이러한 부분을 적용하면 키관리를 사용자 친화적으로 구현이 가능합니다.

  • 참고로 니모닉 코드는 BIP39에서 제시되었습니다.

💡 하나의 니모닉 코드에서 생성 될수 있는 최대 개인키 갯수

굉장히 많은 것으로 알고 있습니다.

정확한 수치는 기억나지 않지만 굉장히 많이 생성이 가능하며 트리구조로 생성이 되게 됩니다

이때 생성되는 키는 일반 자식 키, 단절 자식 키로 나뉘게 되며 일반 자식키의 경우에는 부의 공개 키를 통해 자신의 공개키를 구하며, 단절 자식 키는 부모의 비밀키를 알아야 자신의 공개 키를 구할 수 있습니다.

잘 모르겠습니다;;

💡 니모닉 코드는 왜 12개인가

검색 전

니모닉 코드가 12개인 이유는 byte로 쪼개기 떄문입니다.

정확하게 어떠한 byte로 쪼개는지는 기억을 하지 못하지만 개인키의 byte길이에서 CheckSum인 32byte만큼 덜어내고

나머지 byte길이를 가지고 12개로 쪼개어 단어를 구성하게 됩니다.

12개로 쪼개는 이유는 하나의 단어를 기록하는데에 필요한 최소 byte길이 정도이기 떄문으로 알고 있습니다.

검색 후

일단 128, 25bit길이의 난수를 생성합니다.

이후 Sha256을 통해서 해싱하고 해싱값의 길이에서 32만큼 나눈 값을 뗴어냅니다.

  • 이를 체크섬으로 만듭니다.

체크섬은 어떤 데이터에 오류가 존재하는 지 확인하기 위한 검사용 데이터 이며

체크섬을 난수의 뒤에 붙이고

11bit로 나누어 단어를 만들게 됩니다.

💡 이더리움에서 gas를 사용하는 이유

쉽게말하면 공격자로 하여금 배보다 배꼽을 크게하기 위함입니다.

이러한 의미가 무엇이냐면 공격자가 공격을 통해 얻는 이익보다 작동하는데에 필요한 수수료 즉 gas비가 더 많이 나오게 하기 위해서 gas가 존재를 하고

부수적으로는 채굴자들에게 네트워크를 구성하고 유지시켜준 보상으로 주기 위해서 존재하는 것으로 알고 있습니다.

💡 Solidity access control??

검색 후

어느정도 엑세스를 제어하는 역할을 의미한다는 것으로 이해를 하였습니다.

저희가 Solidity코드를 작성을 할떄 onlyOwner와 같이 특정 조건에 맞을떄만 함수가 실행이 되는 것과 같이 이러한 소유권, 액세스를 제어하는 것으로 알고 있습니다.

💡 이더리움 오라클 문제란

오라클 문제는 저 또한 고민을 해보았고 굉장히 난해한 문제라고 생각을 합니다.

난해한 문제인 이유는 명확한 해결방안이 없기 떄문입니다.

프로그래밍은 어느정도 사람이 작성을 하게 되고 어느정도 예측이 가능합니다.

그러면 반대로 시간을 활용하여 Timestamp를 활용하여도 공격자가 마음만 먹으로 어느정도 예측이 가능한 값이 도출될 것 입니다.

그러한 의미에서 일종의 난수를 생성하기 위한 오라클적인 문제는 어느정도 타협을 해야할 부분이 있다고 생각을 하고 이러한 부분은 구성원들의 기준점에 따라서 달라지게 될 것입니다.

  • 개인적으로는 특정한 해결 방안을 찾지 못하고 있습니다.

💡 Solidity 가시성?

검색 후

상태변수를 말합니다.

  • public, internal, private, external

public인 경우에는 단어에서 알수 있듯이 아무런 제약이 없는 상태를 말합니다.

상속, 외부 등등 모든 방향에서 접근이 가능한 상태 입니다.

internal은 내부에서만 작동이 가능한 상태를 말합니다.

주로 함수내에서 다른 함수를 호출하는 경우만이 있는 경우에 internal로 구현하게 됩니다.

private오로지 해당 컨트랙트 내에서만 실행 가능한 경우를 말합니다.

external은 외부 컨트랙트에서는 호출이 가능하나 내부에서는 호출이 불가능한 상태를 말합니다.

💡 Transfer vs TransferFrom

Transfer는 자신이 돈을 송금할떄 사용이 되는 것이고 TransferFrom은 사용자간의 거래에 있어서 중간에 지갑을 한개 두고 거래를 하는 방식입니다.

이를 좀더 말을 쉽게 풀어쓰면 Transfer는 자신의 지갑에서 자기가 원하는 금액만큼 돈을 주는 것과 같고

TransferFrom은 사용자 간에 접근이 가능한 지갑을 한개 두고 이곳에서 거래를 유발하느것 입니다.

예를들면 A의 지갑에는 5만원이 있고 5만원 중에서 단돈 1만원만 거래를 하고 싶습니다.

그러면 approve를 통해서 두 사람간에 있는 지갑에 만원만을 허용하고 이 1만원 한에서 TransferFrom을 통해서 거래가 진행이 되는 것 입니다.
  • approve에 대해서 openzeppelin의 ERC-20표준 규격을 보고increaseApprove, decreaseApprove에 대해서도 개인적으로 알아보시면 좋을것 같습니다.

💡 Solidity event란

검색 전

일종의 alert와 비슷하게 특정 행위가 일어났을떄 알람을 보내주는 역할을 합니다.

저는 리턴값이 없는 일종의 함수라고 생각을 하며 인지를 하고 있고 주로 Solidity에서 interface에 코드가 구성이 되게 됩니다

검색 후

이벤트는 일종의 트랜잭션 영수증에서 로그를 만들기 위한 객체 입니다.

indexed를 추가하여 불룸필터에 적용이 가능하며 event를 사용하는것 또한 가스비를 소모하는 것이기 때문에 필요한 경우에만 사용이 되어야 합니다.

해당 이벤트를 읽을떄에는 단순히 해당 트랜잭션을 전송할떄 뒤에 콜백을 추가하고 events키워드를 통해서 Client에서 확인이 가능합니다.

💡 Client에서 event를 확인하는 방법

검색 전

이 부분에 대해서 다루어 보지는 않았지만 아는 부분에 대해서 설명을 해보자면

일단 event는 Transaction Receipt정보에 담기게 됩니다.

  • 이는 블록 헤더에 구성이되어있는 데이터더미 입니다.

그후 트랜잭션이 발송을 하게 되면

  • 대표적으로 web3로 생각을 하였을떄

콜백함수를 통해서 어떤 트랜잭션을 발생했는지 event확인이 가능한 정도로 알고 있습니다.

또한 Event를 확인할떄 모든 트랜잭션을 확인하는 것은 비효율적이기 떄문에 이러한 부분에 있어서 불룸필터를 사용하여 필요한 데이터만을 가져오는 것으로 알고 있습니다.

검색 후

💡 Gas Limit vs Gas Price

Gas Limit는 일종의 내가 사용할수 있는 최대 가스량 입니다.

만약 나는 5만원을 기본으로 사용하고 싶은데 7만원 까지는 뭐 괜찮아 라는 생각을 가지게 되면

이러한 상황에서

5만원은 Gas Price, 7만원은 Gas Limit을 의미하게 됩니다.

💡 tx를 전송했는데 gas부족이 발생하면 이더리움은 어떻게 처리하는가

검색 전

이더리움은 tx에서 발생하는 가스비를 통해 채굴자들에게 보상을 주고 해당 채굴자들로 인해서 네트워크를 구성하게 됩니다.

하지만 가스비가 없다는 것은 채굴자들에게 보상이 주지 못하는 것이고 그러면 네트워크가 무너지게 될 것입니다.

일단 기본적으로 최소 gas비를 전송을 하기 전에 확인하게 됩니다.

하지만 전송을 해나감에 있어서 갑자기 트랜잭션이 몰려 더 많은 가스비가 소모가 되면 트랜잭션이 취소가 되게 됩니다.

이떄 블록체인에 기록되는 값(storage)값들은 모두 이전상태로 돌아가고 오로지 최소 가스비만을 소모 하는 것으로 알고 있습니다.

쉽게말해 특정 사용자에게 지불할수 있는 가스비는 30000가 있습니다.

최소 실행 가스비는 21000이라는 기준에서 트랜잭션을 전송할수 있으며 만약 트랜잭션을 전송함으로써 A의 상태를 바꾸게 됩니다.

이때 트랜잭션이 전송이 되었을떄 A의 상태를 바꾸는 과정 또는 네트워크 과부하로 인해 트랜잭션이 실패가 된다면

A의 상태는 기존과 동일하게 유지가 되고 오로지 사용자의 최소가스비가 소모되는 방향으로 진행이 되는 것으로 알고 있습니다.
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글