스마트 컨트랙트 지갑은 기능을 통해 고유한 능력을 가지고 있는 지갑이다.
[1] 2단계 인증
인증 및 기본 지갑 솔루션을 통해 추가 보안 기능을 제공한다.
[2] ATM과 같은 인출 제한
트랜잭션 금액 제한을 설정 가능하다.
- 이는 사용자가 잘못된 높은 금액의 인출을 줄이고 공격자를 방지할 수가 있다.
[3] 화이트리스트 및 블랙리스트
사용자는 지정한 주소(화이트리스트)로 만 전송이 가능하고 차단한 주소(블랙리스트)에는 전송을 하지 않는다.
[4] 사기 경보 및 긴급 잠금
장치를 분실하거나 도난당한 경우 계정에 대한 액세스를 비활성화 할 수 있다.
🔨 하드웨어 지갑
USB같은 외부상태의 지갑을 말한다.
🔨 모바일 지갑
말 그대로 모바일형 지갑이다.
🔨 데스크탑 지갑
네트워크에 맞는 OS를 통해 다운로드하여 작동하는 앱이다.
🔨 웹 지갑
웨사이트에서 호스팅되는 지갑으로 사용자가 계정을 생성하고, 보관하는 지갑이다.
이더리움을 보유하고 송금 및 관리할 수 있는 암호화폐 지갑이다.
이더리움 지갑을 뜻하며 생성하는 것은 매우 간단하다.
이더리움을 보관하고 입&출금 할 수 있는 암호화폐 지갑이다.
블록체인과 바로 통신할 수 있고, 이더리움 지갑을 만들어 이더리움 및 ERC20 토큰들을 보관, 전송 하거나 받을 수 있다.
🔨 특징
[1] 하드웨어 지갑 스타일 보안 기능
[2] 거래를 보호하기 위한 이중 인증
[3] 개인키를 얻을 수 없다.
사용자의 개인키를 점유하지 않는다.
[4] 탈중앙화
P2P통신을 사용하며, 개인 데이터를 수집하지 않는다.
- 오픈 소스이다.
카이카스는 클레이튼 기반의 지갑이다.
누구나 지갑을 생성할 수 있고, PC버전의 크롬브라우저와 개인키 또는 시드구만만 기억한다면 어디서든 자신의 지갑을 가져올 수 있다.
이 또한 단순히 크롬 확장프로그램을 설치하여 사용하면 된다.
클레이튼 기반 테스트넷을 baobab(바오밥)이라고 부른다.
본격적으로 클레이튼 생태계에 새로운 스마트 컨트랙트를 발행하기 전 테스트해볼 수 있는 네트워크를 말한다.
생태계를 활용하여 연산을 하는 것은 수수료가 부과가 되기 떄문에 테스트넷에서 연산을 하는 것이다.
스마트 컨트랙트를 생성하는 과정은 클레이튼 기반 생태계 위에 새로운 프로그램을 등록하는 행위이다.
따라서 이러한 행위에는 수수료가 발생을 하고 이런 수수료는 클레이튼으로 지급을 하게 된다.
- 스마트 컨트랙트를 호출하여 실행하는 연산에는 새로운 값을 추가하거나 변경하는 행위가 포함된다.
테스트넷에서는 테스트를 위한 공짜 클레이를 제공한다.
https://baobab.wallet.klaytn.com/faucet/0xecdc4b200e51ed09ad63cb444d2a56a156c29648
이 링크를 활용하여 KLAY Faucet
에 들어가 자신의 개인키 주소를 입력하면 된다.
모바일용 지갑이라고 생각을 하면 된다.
kakao에서 운영을 하고 있는 지갑이며 클레이튼을 메인으로 작동을 한다.
🔨 특징
[1] 디지털 환경에서는 오프라인 환경의 직인이나 날인을 사용 불가능 하다.
이미지로 저장하여 붙여넣는 등 위변조가 쉽다.
[2] 디지털 환경에 적합한 서명을 디지털 서명이라하며 디지털 서명은 비대칭키를 활용한다.
공개키가 도장을 찍었을떄 보이는 문양이라고 하면 개인키는 도장 그 자체이다.
- 디지털 환경에서는 개인키와 공개키가 정확히 일치해야만 소유권을 주장할 수 있다.
[3] 디지털 자산 지갑을 만들 떄, 소유권을 증명하기 위한 암호화된 비대칭키를 갱성한다.
개인키는 공개되지 않으며, 개인이 보관해야 한다.
- 타인에게 노출되면 안된다.
공개키는 지갑의 주소로사용되기 떄문에 공개 가능하다.
디지털 자산의 지갑은 Klip한가지만 있는 것이 아니다.
니모닉은 지갑을 복구하기 위한 일반적인 단어들의 조합을 뜻한다.
디지털 서명을 생각해 보자.
디지털 서명을 좀더 직관적으로 말해보면 다른 이가 보지 못하고, 내 행위를 증명하는 것이라고 말을 할 수가 있따.
디지털 서명에는 비대칭 키 암호 방식
이 사용이 되고 있으며 비밀키로는 공개키 계산이 가능하지만, 공개키로는 비밀키 계산이 불가능 하게 된다.
즉 비밀키를 가지고 있다면 공개키는 문제가 없다는 말이 된다.
앞서 말했듯이 암호화폐 지갑은 비밀키가 일종의 비밀번호이며 이 비밀번호를 좀더 사용자 들이 직관적으로 볼 수가 있게 만드는 것을 니모닉이라고 한다.
계층적 결정적 지갑을 뜻하면 하나의 시드를 가지고 여러 개의 주소를 쉽게 생성할 수 있는 지갑을 말한다.
쉽게 말해 증권사에서 필요에 따라 계좌를 여러개 쓰는 것과 동일하다.
트리구조로 이루어져 있으며 자신의 상위의 비밀키만 알면 하위는 다 알수 있는 구조로 되어 있다.
부모키가 연속된 자식키를 유도가능하고 각각의 자식키는 손자키를 유도 가능하다.
HD Wallet는 BIP32
에서 제안되었고 이후 BIP44
에서 개선되었다.
HD지갑을 우해서는 크게 두 가지가 필요하다.
하나는 정수로 된 시드, 다른 하나는 그 계정까지의 경로이다.
HD지갑의 경로는 여러개의 정수로 구성되며 갯수에 제한이 없다.
🔨 시드
HD지갑은 시드로부터 마스터키를 생성한다.
- 즉 시드가 최초의 부모라고 생각을 하면 편하다.
니모닉으로부터 시드가 생성이 되며 모든키는 이 시드를 부모로 가지게 된다.
🔨 경로
규칙을 사용하여 식별을 하며 각 트리 레벨은 / 로 구분하게 된다.
마스터 비밀키(시드키 이후로 처음으로 생성된 키)로부터 파생된 비밀키는 m, 마스터 공개키에서 파생된 공개키는 M으로 시작을 한다고 하면
m/0 은 마스터 비밀키의 첫번쨰 자식 비밀키이고, M/0 은 첫번쨰 공개키이다.
그러면 m/0/1 은 마스터 비밀키의 첫번쨰 자식의 두번쨰 자식 비밀키임과 동시에,
마스터 키의 손자의 비밀키가 된다.
eth-lightwallet 모듈
를 활용하여 좀더 직관적으로 볼수가 있는 서버를 만들어 보자.
둘다 새로운 값을 만드는 형태이기 떄문에 post요청을 받는다.
일단 기본적으로 니모닉을 만드는 API주소와 지갑을 만드는 API주소는 이와 같다.
니모닉
- http://localhost:3000/wallet/newMnemonic
지갑
- http://localhost:3000/wallet/newWallet
// 일단 사용할 모듈을 불러와야 한다.
const lightwallet = require("eth-lightwallet");
이후 먼저 니모닉 코드를 만들어보자.
router.post('newMnemonic' ,(req,res)=>{
try{
// 이후 랜덤한 니모닉 문자열을 만들어 주면 된다.
let new mnemonic = lightwallet.keystore.generateRandomSeed();
res.json({mnemonic})
} catch(err){
console.log(err.message)
}
}
일단 니모닉 코드를 만드는 코드이다.
post요청이라서 보통은 password를 받아서 그값을 토대로 해쉬화하고 이후 니모닉을 적용시키지만 단순히 테스트용이기 떄문에 랜덤한 니모닉을 만들어 냈다.
실제로 post요청의 body에는 아무런 값도 들어가지 않지만 랜덤한 니모닉이 만들어 지는 것을 볼 수가 있다.
다음은 지갑을 만드는 코드를 살펴 보자.
코드가 좀 길어서.. 사진으로 대체를 하겠다.
일단 post요청으로 이번에는 인자를 받을 것이기 떄문이 받아준다.
그후 try-catch
를 사용하게 되고
일단 기본적으로 키스토어를 형성한다.
그후 callback를 이용해 키스토어를 인자로 사용하는 함수를 만들게 된다.
ks에서 어떤 값이 들어오는 지를 찍어보면
그후 eth-lightwallet 모듈
의 내장 함수를 사용한다
keystore.keyFromPassword(passord, callback)
이렇게 되면 password를 이용하여 새로운 키가 생성이 되고 이는 pwDerivedKey
에 uint8의 형식으로 저장이 된다.
그후 이 값을 이용해 ks.generateNewAddress
를 해줌으로써 비밀키(password)를 이용하여 새로운 공개키 주소를 만들어 준다.
아까와는 다르게 address가 추가되어 있는 것을 알수가 있다.
이후 fs모듈을 활용하여 로컬에 단순히 파일을 만들어 주면 된다.
keystore
변수는 사진의 내용을 세분화한 값이다.