728x90

팀플때한거는 지갑생성만 해봤었음!

밑에 내용은 여기 내용과 같슴다.

https://newpouy.github.io/jekyll/update/2018/03/24/naivecoin-kr-translate-4.html

 

Naivecoin Korean Translate Version #4

navie코인 번역 원문: lhartikk.github.io

newpouy.github.io

이번 챕터는 wallet 인터페이스를 만드는 것! 

사용자는 

  • private key 비밀키를 가진 지갑을 만들 수 있어야하고
  • 지갑에 잔액을 볼 수 있어야하고
  • 코인을 다른 노드로 보낼 수 있어야함

유저는 비트코인처럼 어떤 노드로 코인을 보내고 또 코인을 받을 나만의 주소만 가질 수 있으면 됨

(트랜잭션 인풋이니 아웃풋이니 뭐니 알필요없이 )

private key 비밀키를 만들고 저장하기

 

우리는 비밀키를 암호화하지는 않은 채로 특정경로( node/wallet/private_key )에 만들도록 할게

 

const privateKeyLocation 

= 특정경로

비밀키 생성하는 함수

const generatePrivateKey = () =>{

ec 암호화?

그걸 비밀키라고 명청

비밀키를 16진수로 내보내

}

 

초기지갑 함수

const initWallet = ()=>{

만약에 비밀키가 특정경로에 있으면 내보내

특정경로에 있지 않으면

비밀키 생성하고

생성했다고 콘솔로 알려줘

}

 

 

비밀키private key로부터 공개키public key(=address 주소의 역할)를 만들어낼 거임

 

지갑에서 공개키가져오는 함수

const getPublicFromWallet = () =>{

비밀키= 지갑에서 비밀키가져와

키= 비밀키를 'hex'화

키를 내보내

}

 

지금 우리는 비밀키를 암호화하지 않아서 보안상 매우 위험한 상황이야. 

이 과정은 간단히 만드는데 초점을 두고 있음요.

지갑은 

오직 하나의 비밀키를 가져야 하고 이로부터 공개가능한 접근가능한 address 주소를 가진 지갑을 만들거야.

 

Wallet balance 지갑 잔고

이전 챕터에서 우리는 블록체인상에 코인을 가지고 있다는 것을

쓰이지 않은 트랜잭션 아웃풋 unspent transaction outputs 한 꾸러미를 가지고 있다는 것을 의미한다고 했음

이 아웃풋 목록은 당연히 자신만의 비밀키와 매칭된 공개 주소값을 가지고 있지.

 

그렇다면 '잔고'계산은 쉬울거야

그냥 '쓰이지 않은 트랜잭션 아웃풋 unspent transaction outputs ' 을 다 더해버리면 돼!

 

잔고를 가져오는 함수 

const getBalance = (address, unspentTxOuts쓰이지않은트랜잭션아웃풋들) =>{

내보내

쓰이지 않은 트랜잭션아웃풋에서

 트랜잭션아웃풋의 주소와 주소가 일치한 애들 걸러내고 

맵함수로 트랜잭션아웃풋의 양들 

다 더해

}

 

잔고조회에는 비밀키가 필요없어. 이는 누구나 주어진 address주소의 잔고를 알수 있다는 뜻!

 

트랜잭션 생성 Generating transactions

코인을 보낼 때 사용자 즉 유저는 트랜잭션 인풋,아웃풋 알필요없다햇지

그럼 사용자 A가 단 한번의 트랜잭션으로 그가 가진 50코인 중 단지 10 코인만 B한테 보내고 싶다면 어떻게 해야될까?

 

방법은 

10코인은 B에게 보내고 

나머지 40코인은 자신A에게 돌려보내는 거지.

 

전체 트랜잭션 아웃풋은 항상 소진spent 되어야해!

만약에 부분으로 나누고 싶다면 새로운 아웃푸을 생성함으로 가능해.

 

 

 

 

트랜잭션 인풋을 만들어야하는데 (받은 코인을 확인하고 보내줘야돼서 그런거라 이해함.)

이를 위해

'소진되지 않은 트랜잭션 아웃unspent transaction outputs'

목록을 돌면서 우리가 원하는 금액이 될때까지 반복문을 돌리는 것임. 

 

트랜잭션아웃풋목록에서 원하는 만큼 찾는 함수

const findTxOutsForAmount =(amount, muUnspentTxOuts) =>{

현재양은 = 0;

사용안된트랜잭션아웃풋들 담겨진 곳 = [];

for (나의 소진되지않은트랜잭션아웃풋들 중의 나의 소진되지않은트랜잭션아웃풋) {

사용안된트랜잭션아웃풋들 담겨진 곳

에다가  나의 소진되지않은트랜잭션아웃풋 을 집어넣어

 

현재 양 = 현재양 + 나의 소진되지않은트랜잭션아웃풋의 양

 

만약에 (현재 양 >= amount) {

남는 양 = 현재양 = amount ;

내보내.  사용안된트랜잭션아웃풋들 담겨진 곳,  남는 양 

}

}

 

아니면 에러 뱉어 '거래보낼 코인이 충분하지 않아' 

 

}

 

 

leftOverAmount 남은 금액양은 나중에 자신에게 다시 back할 금액이야

소진되지않은 트랜잭션 아웃풋을 가진만큼 트랜잭션 txIns를 만들어낼 수 있어. 

 

서명되지않은 TxIn으로 함수

const toUnsignedTxIn = (unspentTxOut) =>{

트랜잭션인풋 = 새 트랜잭션인풋함수;

트랜잭션인풋의 트랜잭션아웃풋 아이디 = unspentTxOut의 트랜잭션아웃풋 아이디

트랜잭션인풋의 트랜잭션아웃풋 인덱스 = unspentTxOut의 트랜잭션아웃풋 인덱스

내보내 트랜잭션인풋;

}

 

const {

사용안된트랜잭션아웃풋들 담겨진 곳includedUnspentTxOuts

남은금액양 leftOverAmount 

} = findTxOutsForAmount(amount, myUnspentTxouts);

 

서명되지 않은 TxIn인풋들 함수

const unsignedTxIns =

사용안된트랜잭션아웃풋들 담겨진 곳에서

서명되지않은 트랜잭션인풋 하나씩 꺼내. 

 

 

 

다음으로는 두 개의 트랜잭션 아웃풋들txOuts를 만들어야해요

하나는 보낼것.

다른 하나는 다시 back할 것. 

 

만약 txIns 트랜잭션인풋들이 보낼 금액과 같다면

남은금액 leftOverAmount값은 0이므로 

back하기 위한 트랜잭션은 만들지 않아도 되지. 

 

트랜잭션아웃풋들을 만드는 함수

const createTxOuts =(수신자주소, 내 주소 , 양, 남은금액양 ) => {

const txOut1  = 새 트랜잭션아웃(수신자주소, 양)

만약에 (남은금액양 === 0) {

[txOut1] 배열에 담아서 내보내

}

아니면 

const leftOverTx =  새 트랜잭션아웃풋(내 주소, 남은금액양)

내보내 [txOut1 , leftOverTx]

 

}

 

마지막으로 트랜잭션 id값을 생성하고

트랜잭션인풋들에 

서명하면 끝임

 

const tx = 새 트랜잭션함수;

tx의 트랜잭션인풋들은 = 서명하지 않은 트랜잭션 인풋들;

tx의 트랜잭션아웃풋들은 = 트랜잭션아웃풋들을 만드는 함수(수신자주소, 내주소, 양, 남은금액양)

tx의 아이디 = 트랜잭션아이디가져오는 함수(tx)

 

tx의 트랜잭션 인풋 = tx의 트랜잭션인풋들을 맵함수로 

트랜잭션인풋을 골라서

그것의 서명 = 사인한다트랜잭션인풋에(tx, Index, privateKey, unspentTxOuts)

내보내 트랜잭션인풋

 

 

 

지갑사용하기 Using the wallet

지갑을 사용하기 위한 버튼기능 렛츠고

 

app.post('/mineTransaction' ,(요청, 응답) =>{

주소는 요청.body.주소

양은 요청.body.양

const resp = 트랜잭션가지고 다음블럭생성하는 함수 generatenextBlockWithTransaction(주소, 양)

응답.해서 resp를 내보내

 

})

 

 

 

 

 

 

이것처럼 사용자는 

주소랑 코인금액(양)만 제공하면 됨.

블록체인의 노드가 나머지는 알아서 할거야 물론 코드짰으니까 가능한거겠지 쿸

 

결론 

우리가 지금 한거는 

아주 간단한 수준의 트랜잭션 알고리즘을 가진 비암호화된 지갑이야.

이 알고리즘은 2개의 아웃풋들만 만들어낼뿐이지만,

실제 현실 블록체인은 다르겠지?

 

우리는 이 지갑에서 50코인의 인풋을 가지고 5,15,20의 아웃풋을 만들 수 있어.

하지만 이것도  /mineRawBlock 인터페이스를 사용해서 조절가능하지.

 

블록체인에서 직접 채굴을 함으로써 원하는 트랜잭션을 발생시킬 수도 있어!

발생시킨 트랜잭션을 블록체인에 연결시키는 것을 다음챕터에서 할거임요.

이번 내용 코드는 이거

https://github.com/lhartikk/naivecoin/tree/chapter4

 

GitHub - lhartikk/naivecoin: A tutorial for building a cryptocurrency

A tutorial for building a cryptocurrency. Contribute to lhartikk/naivecoin development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts