자바스크립트로 블록체인 구현 강좌4 - 나만의 비트코인 발행하기
지난 포스팅에 이어서 이번시간에는 저번 포스팅에서 작성한 마지막 블락 가져오기 함수와 새로운 트랜젝션 생성하기 함수를 test.js 에서 한번 찍어 보겠다. 그리고 트랜잭션과 새로운 블락이 생겼을 때 , 그리고 새로운 블록이 생긴 이후 트랜잭션 데이터는 어떻게 변하는지 이 관계를 살펴보도록 하자.
test.js로 이동해서 새로운 블락을 생성하는 함수와 새로운 트랜젝션을 생성하는 함수를 하나씩 작성한다.
//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain')
//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();
//새로운 블락 만들기
bitcoin.createNewBlock(1111,"aaaaaaa","1a1a1a1a1a1a");
//새로은 트랜잭션 생성 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(100,'PACKadffaaf','HONGllalflks')
//찍어보기
console.log(bitcoin)
//결과
/*
Blockchain {
chain:
[ { index: 1,
timestamp: 1527228481937,
transactions: [],
nonce: 1111,
hash: '1a1a1a1a1a1a',
previousBlockHash: 'aaaaaaa' } ],
pendingTransaction:
[ { amount: 100, sender: 'PACKadffaaf', recipient: 'HONGllalflks' } ] }
*/
위의 코드에서 주석처리된 결과 부분을 보자
새로운 블락인 index 1 은 chain 배열에 객체 형태로 들어갔다.
그뒤 발생한 새로운 트랜젝션 은 pendingTransaction 배열에 객체 형태로 들어갔다.
그래서? 이게 뭐? 라고 생각할 수도 있다. 일단은 지금까지 이론으로만 알았던 '블록 하나에 거래내역을 저장한다' 라는 말이 조금 이해가 될것이다.
그래서 블록체인을 공용장부라고 한다. 일단은 지금 index 1 블록의 transaction[]은 비어있다. 그렇다면 지금 pendingTransaction에 있는 거래 데이터를 어떻게 index : 1 인 블록의 transaction에 기록할까? 채굴을 해야 한다. 이말은 새로운 블락이 하나더 생성이 되면 그 새로운 블락의 transaction에 지금의 미완료된 트랜젝션이 기록된다는 뜻이다.
//새로은 트랜잭션 생성 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(100,'PACKadffaaf','HONGllalflks') 이 코드 아래에 추가
//새로운 블락 생성 - 채굴후 얻은 블락
bitcoin.createNewBlock(2222,"bbbbbbb","2b2b2b2b2b2b");
새로운 블록이 추가 되었다. 한번 찍어보자. 뚜둥. 결과 값은 아래와 같다. 위에서 발생한 pendingTransaction 거래 기록은 새로 생성된 index 2 인 블록의 transaction[] 배열에 들어 갔다. 지금은 [Array] 이렇게 표시가 되어 있는데 저 부분만 한번 찍어보자.
//결과
/*
Blockchain {
chain:
[ { index: 1,
timestamp: 1527229062594,
transactions: [],
nonce: 1111,
hash: '1a1a1a1a1a1a',
previousBlockHash: 'aaaaaaa' },
{ index: 2,
timestamp: 1527229062594,
transactions: [Array],
nonce: 2222,
hash: '2b2b2b2b2b2b',
previousBlockHash: 'bbbbbbb' } ],
pendingTransaction: [] }
*/
index : 2 블록 부분만 찍어보았다. 아래에. transactions 배열 부분을 보자. 위에서 봤던 pendingTransaction의 객체 형태의 데이터가 들어가 있다.
//찍어보기
console.log(bitcoin.chain[1])
//결과
/*
{ index: 2,
timestamp: 1527229359157,
transactions:
[ { amount: 100, sender: 'PACKadffaaf', recipient: 'HONGllalflks' } ],
nonce: 2222,
hash: '2b2b2b2b2b2b',
previousBlockHash: 'bbbbbbb' }
*/
이제 대충 감이 올것이다. 추가로 트랜젝션을 더 발생시켜보자. 위에서 작성한 새로운 블락 만드는 소스 아래에 소스 코드를 추가해준다.
//새로은 트랜잭션 생성2 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(777,'PACKadffaaf','HONGllalflks')
//새로은 트랜잭션 생성3 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(888,'PACKadffaaf','HONGllalflks')
//새로은 트랜잭션 생성4. - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(999,'PACKadffaaf','HONGllalflks')
그리고 다시 node 명령어로 실행을하고 결과를 보자. 위에서 발생한 트랜젝션 3건 데이터가 어디에 있는가? 이것만 빨리 캐치하면 된다. pendingTransaction 배열에 있다. 아직 미완결된 거래이기 때문에 일단 저기 들어가 있다. 그러면 저 데이터가 블락안에 들어가서 신뢰할 수 있는 데이터가 되려면 어떻게 해야 하나? 컴퓨팅 파워로 암호를 풀어서 생성해주면 된다. 일단 지금은 컴퓨팅 파워를 엄청 써서 새로운 블락을 또 생성했다고 가정하자. 또 새로운 블락이 생성이 되었기 때문에 해당 코드를 한번 더 작성해보자.
//찍어보기
console.log(bitcoin)
//결과
/*
Blockchain {
chain:
[ { index: 1,
timestamp: 1527229704057,
transactions: [],
nonce: 1111,
hash: '1a1a1a1a1a1a',
previousBlockHash: 'aaaaaaa' },
{ index: 2,
timestamp: 1527229704057,
transactions: [Array],
nonce: 2222,
hash: '2b2b2b2b2b2b',
previousBlockHash: 'bbbbbbb' } ],
pendingTransaction:
[ { amount: 777, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 888, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 999, sender: 'PACKadffaaf', recipient: 'HONGllalflks' } ] }
*/
마이닝으로 새로운 블락이 생성되었다.
//새로운 블락 만들기
bitcoin.createNewBlock(3333,"ccccccc","3c3c3c3c3c3c");
이전 거래들이 어떻게 이동이 되는지 자세히 보라. pendingTransaction[] 에 일단 값들이 보이지 않는다. 그리고 index:3 블록 transactions[] 에 Array 배열 값이 생겼다. 이제 거의 감을 잡았으리라 생각한다. 찍어보자.
console.log(bitcoin)
//결과
/*
Blockchain {
chain:
[ { index: 1,
timestamp: 1527229993383,
transactions: [],
nonce: 1111,
hash: '1a1a1a1a1a1a',
previousBlockHash: 'aaaaaaa' },
{ index: 2,
timestamp: 1527229993384,
transactions: [Array],
nonce: 2222,
hash: '2b2b2b2b2b2b',
previousBlockHash: 'bbbbbbb' },
{ index: 3,
timestamp: 1527229993384,
transactions: [Array],
nonce: 3333,
hash: '3c3c3c3c3c3c',
previousBlockHash: 'ccccccc' } ],
pendingTransaction: [] }
*/
index : 3 블록만 찍어보았다. 이전 거래내역들이 새로 생성된 블락으로 이동한것을 볼 수 있다.
//찍어보기
console.log(bitcoin.chain[2])
//결과
/*
{ index: 3,
timestamp: 1527230266389,
transactions:
[ { amount: 777, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 888, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 999, sender: 'PACKadffaaf', recipient: 'HONGllalflks' } ],
nonce: 3333,
hash: '3c3c3c3c3c3c',
previousBlockHash: 'ccccccc' }
*/
혹시나해서 test.js의 전체 코드를 올려놓는다.
//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain')
//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();
//새로운 블락 만들기
bitcoin.createNewBlock(1111,"aaaaaaa","1a1a1a1a1a1a");
//새로은 트랜잭션 생성 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(100,'PACKadffaaf','HONGllalflks')
//새로운 블락 생성 - 채굴후 얻은 블락(마이닝)
bitcoin.createNewBlock(2222,"bbbbbbb","2b2b2b2b2b2b");
//새로은 트랜잭션 생성2 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(777,'PACKadffaaf','HONGllalflks')
//새로은 트랜잭션 생성3 - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(888,'PACKadffaaf','HONGllalflks')
//새로은 트랜잭션 생성4. - (총금액, 보내는이, 받는이)
bitcoin.createNewTransaction(999,'PACKadffaaf','HONGllalflks')
//새로운 블락 만들기
bitcoin.createNewBlock(3333,"ccccccc","3c3c3c3c3c3c");
//찍어보기
console.log(bitcoin.chain[2])
//결과
/*
{ index: 3,
timestamp: 1527230266389,
transactions:
[ { amount: 777, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 888, sender: 'PACKadffaaf', recipient: 'HONGllalflks' },
{ amount: 999, sender: 'PACKadffaaf', recipient: 'HONGllalflks' } ],
nonce: 3333,
hash: '3c3c3c3c3c3c',
previousBlockHash: 'ccccccc' }
*/
!!만약에 이 포스팅을 보면서 따라 해봤는데도 이해가 안간다면 이것만 기억하자.
1.거래가 발생하면 트랜잭션 데이터가 생긴다.
2.이 데이터는 아직 신뢰할 수 없다.
3.어떻게 해야하나? -> 채굴자들이 마이닝을 해서 새로운 블락을 생성해야 한다.
4.새로운 블락이 생성되었다.
5.이전 트랜잭션 데이터는 새로운 블락에 쓰여지면서 신뢰할 수 있게된다.
댓글