Section4 부터는 블록체인 기술실습을 진행한다.
스마트컨트랙트지갑은 스마트컨트랙트 기능을 통해 고유한 능력을 가진 지갑이다. 사용자를 위한 멀티 시그 트랜잭션, 추가 보안 및 복구 기능을 사용할 수 있다.
기능
💡 멀티 시그 월렛이란?
멀티 시그 월렛(multi-signature wallet)은 스마트 컨트랙트 월렛의 한 종류로, 멀티시그(multi-sig)를 통해서만 송금이 가능하다는 특징이 있다.
기존의 핫 월렛과 콜드 월렛은 하나의 개인 키를 사용하기 때문에, 이 단일 키가 노출될 경우 탈취자가 해당 개인 키에 연결된 자산에 쉽게 접근할 수 있다는 단점이 있다.이러한 단점을 보완하기 위한 것이 바로 멀티 시그 월렛이다.
멀티 시그 월렛은 하나의 지갑에 N명의 사용자가 지갑에 대한 소유 권한을 가지고, 해당 지갑에서 트랜잭션을 만들기 위해서는 N명 중 k명이 트랜잭션에 서명을 해야 한다. 이더리움 상에서 구현할 때는, 멀티 시그 월렛을 위한 스마트 컨트랙트를 만들어 N명 중 k명이 서명해야 컨트랙트를 이행한다는 서명 제한 룰을 추가하고, 실제로 k명이 멀티 시그 월렛 컨트랙트에 트랜잭션을 보내야 한다.
이에 슈노르 서명을 적용하기도 한다.
멀티 시그 월렛은 일반 지갑에 비해 보안이 우수하다는 장점이 있으며, 실수로 송금이 일어나는 경우를 방지할 수도 있다. N명 중 1명이 실수로 송금 트랜잭션을 생성해도, 나머지 N-1명이 서명을 하지 않으면 트랜잭션이 완료되지 않기 때문이다.그러나 멀티 시그 월렛은 스마트 컨트랙트 상에서 구현되기 때문에 사용성이 부족하다. 가령, 대부분의 암호화폐 거래소에서는 일반 지갑 간에 이루어진 트랜잭션만 처리하기 때문에 멀티 시그 월렛에서 일어난 트랜잭션을 인식하지 못하기도 한다.또한 멀티 시그 월렛은 스마트 컨트랙트 상에서 구현되기 때문에 컨트랙트 코드의 오류로 인해 문제가 발생할 수 있다.
멀티 시그 월렛에는 ConsenSys, Gnosis, Argent, BitGo 등이 있다.
하드웨어 지갑은 거래에 서명할 때 개인 키를 인터넷에 노출하지 않기 때문에 온라인 상태에서 자산에 액세스하는 가장 안전한 방법이다.
모바일 지갑은 데스크톱 & 웹 지갑의 모바일형 지갑이다.
데스크탑 지갑은 Windows, Mac 또는 Linux같은 OS에 다운로드하여 작동할 수 있는 앱이다.
웹 지갑은 웹사이트에서 호스팅되는 지갑으로 사용자가 계정을 생성하고, 보관할 수 있다.
장점과 단점
메타마스크(Metamask)는 이더리움을 보유하고 송금 및 관리할 수 있는 암호화폐 지갑이다. 구글 크롬 웹브라우저에서 플러그인 방식으로 사용하는 크롬 확장 프로그램으로 사용된다.
지갑 생성은 니모닉 코드(Mnemonic code)를 사용한다.
마이이더월렛(MEW)은 이더리움을 보관하고 입&출금 할 수 있는 암호화폐 지갑이다. 사용자들은 마이이더월렛을 이용하여 블록체인과 바로 통신할 수 있고, 이더리움 지갑을 만들어 이더리움 및 ERC20 토큰들을 보관, 전송 하거나 받을 수 있다.
마이 이더 월렛 만들기(생성법) 및 거래소에서 코인 옮기는 방법
메타마스크와 마이이더월렛을 통하여 웹을 이용한 계정 생성방법을 알아보았다.
이번에는 CLI를 통해 이더리움 계정을 생성하고, 테스트넷에서 테스트 이더를 받는 방법까지 알아보자.
Homebrew가 설치되어 있다는 전제하에 진행된다. Homebrew가 설치되어 있지 않다면, 여기서 설치.
1. 다음 명령을 실행하여 탭을 추가
$ brew tap ethereum/ethereum
2. 탭 추가가 완료되면, Geth를 설치
$ brew install ethereum
Ubuntu에서 PPA(Personal Package Archives)를 사용하여 Geth를 설치한다.
1. 런치패드 저장소 활성화를 위해 다음을 실행
$ sudo add-apt-repository -y ppa:ethereum/ethereum
2. Geth를 설치
$ sudo apt-get update
$ sudo apt-get install ethereum
1. Geth 명령어를 사용하여 새로운 계정을 만든다
$ geth account new
2. 위의 명령어를 실행하면, 비밀번호
를 입력하라고 한다. 재확인 비밀번호
도 입력해준다.
Your new account is locked with a password. Please give a password. Do not forget this password.
Password:
Repeat password:
3. 알맞게 입력했다면, 새로운 키를 생성했다는 말과 함께 address
와 secret key file 경로
를 알려준다.
!! 중요 !! address와 secret key file 경로, 비밀번호는 잊지 않도록 안전한 곳에 백업해야함. 특히, secret key file의 경우 절대로 잃어버리시면 안됨.
Your new key was generated
Public address of the key: [계정 주소]
Path of the secret key file: [secret key file 경로]
- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!
4. 현재 자신이 가지고 있는 계정 리스트를 보려면 다음의 명령어를 실행
$ geth account list
Account #0: {a1ce1ae4e215858f7c79da67b2996331af3ee7b1} keystore:///Users/insulee/Library/Ethereum/keystore/UTC--2021-11-11T15-29-11.509514000Z--a1ce1ae4e215858f7c79da67b2996331af3ee7b1
1. Geth JavaScript 콘솔을 사용하여 롭스텐 테스트넷에 접속
> geth console 2> /dev/null --ropsten
> net.listening
2. 롭스텐 테스트넷 용 계정을 생성한다.
계정 생성 전에 다음의 명령어를 실행하고, 생성 전과 후가 어떤 차이가 있는지 확인해보자
> eth.accounts;
명령어를 실행하고, 비밀번호
와 재확인 비밀번호
를 입력.
> personal.newAccount();
Passphrase:
Repeat passphrase:
3. 롭스텐 테스트 이더 받는 페이지에서 테스트 이더를 받은 후 실제로 들어왔는지 확인해보자.
# eth.accounts[ ] 에 있는 숫자는 `eth.accounts;` 실행 후 몇 번째 주소인지 입력하면 된다. ex, 첫 번째 주소는 "0"
> eth.getBalance(eth.accounts[0]);
이더스캔(Etherscan)은 이더리움 블록체인에서 일어나고 있는 모든 활동과 정보를 쉽게 검색할 수 있는 사이트이다. 이더리움의 블록 생성 내역, 트랜잭션 조회, 지갑 정보 조회, 이더리움 기반의 토큰 검색 등 블록체인에서 일어나고 있는 모든 활동과 정보를 쉽게 검색할 수 있다.
지금까지 생성해본 메타마스크, 마이이더월렛, GethWallet은 결국 같은 형태의 지갑이기 때문에 각각의 주소를 검색하면 찾을수 있다.
사용방법
테스트넷에서 발생한 트랜잭션 확인은 시간이 걸린다.
카이카스(KaiKas)는 클레이튼 기반의 지갑이다. 누구나 새로운 지갑을 생성할 수 있고, PC 버전의 크롬 브라우저와 개인키 또는 시드구문만 기억하고 있다면 언제, 어디서든 자신의 지갑을 가져올 수 있다.
크롬 웹 스토어의 카이카스 설치화면 바로가기를 클릭하여 크롬 웹 스토어로 이동하고, 안내를 따라 카이카스 지갑을 설치, 설치한 카이카스 지갑을 실행한다. 크롬 브라우저의 우측 상단에서 설치된 카이카스를 실행할 수 있다.
다음은 노트북을 분실하거나 크롬 브라우저를 삭제했을 때처럼 예기치 못하게 지갑을 분실한 경우, 새로운 환경에서 지갑을 불러올 때 사용하는 방법이다. Restore 이라고 하는 이 과정은 시드 구문을 이용해 카이카스 지갑을 불러오는 과정이다. 이 과정을 실습해보려면, 크롬 브라우저에 설치된 카이카스를 삭제하고 재설치해라.
크롬 확장프로그램 MetaMask에서 생성한 지갑은 KaiKas에서 Import 하거나 반대로 카이카스 지갑을 메타마스크로 Import 할 수 할수있다.이 방법을 이용하면 서로 다른 체인으로 보낸 (NFT를 포함하는) 토큰을 다시 되찾을 수 있다.
클레이튼 기반 테스트넷은 baobab(바오밥)이라고 부른다. 바오밥 테스트넷은 클레이튼 기반의 메인넷에 새로운 스마트 컨트랙트를 발행하기 전 테스트해볼 수 있는 네트워크이다. 블록체인에서 스마트 컨트랙트를 생성하거나, 스마트 컨트랙트를 호출하여 연산을 실행하는 경우 체인이 요구하는 코인을 지급해야 한다. 다시 말해, 클레이튼 기반에서 스마트 컨트랙트를 생성하거나, 스마트 컨트랙트를 호출하여 연산을 실행하는 경우에는 클레이튼이 일부 사용된다는 말이다. baobab testnet에서 사용할 클레이튼을 받아보자.
💡 테스트용 클레이튼 지급을 요구할 때마다 지갑의 개인키를 이용해야 하기 때문에 테스트용 지갑은 메인넷 지갑과 별개로 사용하는 것이 좋다.
카이카스를 실행한다.
카이카스의 좌측 상단에 위치한 지갑의 별명을 클릭해 계정 정보에 진입한다.
나타난 팝업 창의 하단에 위치한 지갑키 관리
를 클릭합니다.
지갑키 내보내기를 클릭 (주의) 어떤 서비스에서도 지갑키를 직접적으로 요구하는 경우는 없다. 따라서, 테스트용 지갑을 별도로 운용하는 것이 좋다.
나타난 개인키를 사용한다. 키스토어 파일로 저장하고 사용해도 됨.
복사한 개인키는 다음과 같은 모양을 하고 있다.
0x4025c289c531346c947c2dfa03830e6f3af165719ae8f57c0598a445feaf44d6
0xeb56c41cc64aad8fb7f6d7e5d4e2983a8a84e9fff66958af532cde9928bc9a5e
우측 상단의 네트워크가 Baobab Testnet
인지 확인.
좌측에 선택된 카테고리가 Klay Faucet
인지 확인.
위에서 복사한 개인키를 붙여넣는다.
체크박스를 클릭하여 개발용 클레이튼 지급에 동의.
Access
버튼을 클릭하여 다음 화면으로 이동.
다음의 화면이 나타나면, 정상적으로 진입한 결과이다.
Run Faucet
버튼을 클릭하여 테스트용 클레이튼 지급을 실행. 테스트용 클레이튼은 지급 후 24시간이 지나야 새롭게 지급받을 수 있다. 이때 지급되는 테스트용 클레이튼의 수량은 5개이다.
니모닉이란 난수(시드 키)를 12개의 영단어로 인코딩한 영단어 그룹으로 블록체인에서 니모닉은 지갑을 복구하기 위한 일반적인 단어들의 조합을 뜻한다.
기존의 시드 키는 숫자와 문자로 구성된 난수이기 때문에 사용자가 기억하기 어려웠지만, 니모닉 코드 단어의 경우 사용자가 기억하고 사용하기 쉬운 형태로 구성되어 있다는 장점이 있다. 이 니모닉 코드만 기억하고있으면 시드 키 및 파생된 모든 비밀 키를 복구할 수 있다.
사전적 의미로는 정보의 기억을 위한 기억술이다.
[예시]
💡 시드 키: 8979644bfb6b6206792bdd6a071b3a00daebfb84ac5e3d81fa8c87a8012b04be060765762d4540ff10788959a84dec51667f34b0380e66be373d0ab2c62f8f94
니모닉: endless convince patrol calm apology scene client jungle fitness blind grass pause
[예시] 메타마스크에서 사용되는 니모닉
비대칭 키 암호 방식
공개 키(Public key)와 비밀 키(Secret key; Private key) 가 있다. 이 두 키의 관계를 보면, 공개 키로 데이터에 서명했을경우, 비밀 키로는 계산이 되는데, 공개 키로는 계산이 불가능하게 된다. 다시 말해, 비밀 키만 가지고 있으면, 공개 키는 여기저기 공개해도 상관없는 것이다.이 방법을 사용하면 공개 키는 누구에게나 공개되어 있기 때문에 중요한 데이터를 암호화하는 데에는 적합하지 않다.💡 일반적인 암호화 알고리즘은 데이터를 숨기고 안전하게 전달하는 기밀성이 그 목적이기 때문에 공개 키로 암호화하는 방식을 사용하는데 블록체인에서는 디지털 서명을 하여 데이터의 무결성과 진위성을 검증하는것을 목적으로 하기 떄문에 비밀 키로 암호화하는 방식을 사용한다.
니모닉은 순서대로 맞춰진 단어가 암호화된 보안 비밀번호 방식으로, 문자 배열을 초기대로 하지 못하면 어느 누구도 지갑을 열 수 없다.비밀 키의 암호화 알고리즘 보안 성능은 2^256(2의 256승)이다. 이것을 사람이 사용하기엔 엄청나게 큰 수이기 때문에 16진수 64글자로 바꾼다. 여기에 비슷하게 생긴 글자들(ex. 0,O 등)을 제외한 58개를 가지고 2^256(2의 256승)을 표현하더라도 사람이 쓰기엔 불편하다. (ex. 5KRQ7XK5oU48pqABR2bkiwqP6oZj2W1Fb6stJgjdoNhBZsVYK7m)
BIP-39에 정의된 니모닉 코드와 시드 생성 9단계는 다음과 같다.💡 시드 키를 생성할 때는 PBKDF2 함수를 사용한다. PBKDF2는 키 스트레칭 함수의 한 종류이다.
128bit 또는 256bit 길이의 난수를 생성
난수를 SHA-256 알고리즘으로 해싱하고, 해시값에서 (시드 키의 길이) / 32
만큼을 떼어낸다. 가령, 난수의 길이가 128bit라면, 해시값에서 128 / 32
인 4bit를 앞에서부터 떼어내 체크섬으로 만든다.
체크섬(checksum): 어떤 일련의 데이터에 오류가 존재하는 지 확인하기 위한 검사용 데이터
체크섬을 난수의 뒤에 붙인다.
체크섬을 붙인 난수를 11bit 단위로 잘라낸다.
각 11bit의 단어를 사전에 정의된 단어로 치환한다.
각 11bit의 순서를 유지하여 일련의 니모닉 코드를 만든다.
HD Wallet은 Hierarchical Deterministic Wallet(계층적 결정적 지갑)의 약자로, 하나의 시드(Seed) 값만 가지고 있으면 여러 개의 주소를 쉽게 생성할 수 있는 지갑이다.
쉽게 설명하자면, 증권사에서 필요에 따라 계좌를 여러개 쓰는 것과 동일하다.(ex. CMA, 종합, 금 등) 여러 개의 키를 관리할 때 하나로 관리하면 되기 때문에 하나의 키로부터 다목적 관리를 할 때 좋다.
Hierarchical는 하나에서 다른 하나를 유도하는 것, Deterministic은 트리구조가 상위의 비밀 키만 알면 하위는 다 알 수 있다는 뜻이다. 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 트리 구조로 이루어져 있으며, 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 수 있다.
HD Wallet은 BIP-32에서 제안되었고, BIP-44에서 개선되었다.
💡 비결정적 지갑과 결정적 지갑
기본적으로 암호화폐를 사용할 때는 개인 정보 보호를 위해 암호화폐 주소는 재사용하지 않는 것이 가장 바람직하다. 극단적으로는 매 트랜잭션마다 새로운 비밀 키를 생성할 수 있다. 이는 기존의 지갑은 새로운 비밀 키를 무작위로 추출해 보관해야 한다. 이런 식으로 매번 무작위로 비밀 키를 생성하다보면, 실수로 지갑 데이터를 분실하는 경우 해당 비밀 키에 저장된 코인과 해당 비밀 키로 생성한 스마트 컨트랙트에 접근하지 못하게 된다. 따라서 지갑 데이터를 자주 백업해야 하는 불편함이 있다. 이렇게 매번 비밀 키를 무작위로 생성하는 방식의 지갑을 비결정적 지갑이라고 한다.
이러한 비결정적 지갑의 불편함을 해결하는 방식의 지갑이 바로 결정적 지갑이다. 결정적 지갑은 하나의 시드에서 하나의 시드 키를 가지고 있으며, 이 시드 키는 비밀 키를 만들기 위한 난수이다. 비밀 키는 시드 키를 인덱스 또는 다른 데이터와 결합하여 만든다. 이 시드 키는 자신으로부터 만들어진 비밀 키를 복구할 수 있다. 이러한 특징 때문에 시드 키로부터 만들어지는 모든 비밀 키는 그 값이 미리 정해져 있다고 볼 수 있다. 따라서 시드 키를 이용한 지갑 방식을 결정적 지갑(deterministic wallet)이라고 한다. 결정적 지갑을 사용하면 하나의 시드 키와 경로만 알고 있어도 시드 키에서 파생된 모든 비밀 키를 알 수 있기 때문에 모든 비밀 키를 관리할 필요 없이, 시드 키 하나만을 관리하면 된다.
m/0은 마스터 비밀 키의 첫 번째 자식 비밀 키
이고, M/0은 첫 번째 자식 공개 키
가 된다. m/0/1은 마스터 비밀 키의 첫 번째 자식의 두 번째 자식 비밀 키이며, 마스터 키의 손자의 비밀 키
가 된다.💡 HMAC-SHA512
HD 지갑에서는 부모 키를 통해 자식 키를 확인할 수 있어야 하기 때문에, HMAC 방식을 사용하여 자식 키를 마든다. HMAC-SHA512는 부모의 키 값을 패딩하여 XOR 연산을 하고, 그 결과값을 해싱한다. 마스터 키는 시드 키에 HMAC-SHA512를 연산한 결과값이다.
BIP44는 여러 계정이 여러 목적에 맞게 여러 지갑을 사용할 수 있는 HD 지갑 구조를 제안하였다. BIP44에는 다섯 가지 트리 레벨로 구성된다.
M/44'/60'/0'/0/2 : 이더리움 계정에 대한 세 번째 수신 공개키
M/44'/0'/3'/1/14 : 4번째 비트코인 계정의 15번째 주소 변경 공개키
m/44'/2'/0'/0/1 : 트랜잭션 서명을 위한 라이트코인 메인 계정의 두 번째 개인 키
이 방법이 더 좋은 2가지 이유가 있다.
참고Ethereum Wallet 및 Keystore 파일 생성 및 암호화 원리
eth-lightwallet 모듈에 내장되어 있는 함수를 사용하여 간단한 Mnemonic Wallet을 개발하고, Postman을 사용하여 API 테스트를 해보자. 서버는 express로 구현하였다.
newMnemonic
API 만들기
Postman을 사용해 테스트 해보면 정상적으로 니모닉코드가 응답되는 것 을 알 수 있다.
mnemonic code
와 password
를 이용해 newWallet
API 만들기
Postman을 사용해 테스트 해보자
1
에서 얻은 니모닉 코드를 mnemonic
이라는 키의 값으로, password
에는 원하는 비밀번호를 입력 후 요청한다. keystore
를 json 파일로 만들어 로컬 서버에 저장하기 Postman을 실행하여, 로컬에 키스토어 파일이 생기는지 확인