검색결과 리스트
글
파이썬으로 나만의 블록체인 만들기 #2
정보보안
2017. 11. 15. 01:06
#참고 : 이 글은 @ecomusing 님의 포스트를 제 맘대로 번역한 글입니다. 원문보기
#참고2 : 전체 Jupyter / iPython 소스코드 받기
블록체인 만들기 : 거래내역에서 블록으로
이제 우리의 블록체인을 만들기 시작할 준비가 되었습니다. 지금은 블록체인에 아무것도 없지만, 'genesis block'(시스템의 첫번째 블록)을 정의함으로써 시작할 수 있는 몇 가지 포인트를 얻을 수 있습니다. 왜냐하면 'genesis block'은 첫번째 블록이라서 어떠한 블록도 연결이 되어있지 않고, 그래서 조금 다르게 다뤄지고, 우리가 시스템 상태를 임의로 설정할 수 있기 때문입니다. 우리의 경우에는 두 사람의 계좌를 만들고 각각 50 코인씩을 넣어줄 것입니다.
In [7]:
state = {u'Alice':50, u'Bob':50} # Define the initial state
genesisBlockTxns = [state]
genesisBlockContents = {u'blockNumber':0,u'parentHash':None,u'txnCount':1,u'txns':genesisBlockTxns}
genesisHash = hashMe( genesisBlockContents )
genesisBlock = {u'hash':genesisHash,u'contents':genesisBlockContents}
genesisBlockStr = json.dumps(genesisBlock, sort_keys=True)
그뤠잇! 이 블록이 다른 모든 블록에 연결될 첫번째 요소가 될 것입니다.
In [8]:
chain = [genesisBlock]
각각의 블록에 대해서 우리는 거래내역을 모으고, 해더와 해당 해쉬 값을 만들고 이것을 체인에 추가할 것입니다.
In [9]:
def makeBlock(txns,chain):
parentBlock = chain[-1]
parentHash = parentBlock[u'hash']
blockNumber = parentBlock[u'contents'][u'blockNumber'] + 1
txnCount = len(txns)
blockContents = {u'blockNumber':blockNumber,u'parentHash':parentHash,
u'txnCount':len(txns),'txns':txns}
blockHash = hashMe( blockContents )
block = {u'hash':blockHash,u'contents':blockContents}
return block
이제 이 함수를 사용해서 임의로 생성한 거래내역들을 블록들로 만드는 처리를 진행해봅시다.
In [10]:
blockSizeLimit = 5 # Arbitrary number of transactions per block-
# this is chosen by the block miner, and can vary between blocks!
while len(txnBuffer) > 0:
bufferStartSize = len(txnBuffer)
## Gather a set of valid transactions for inclusion
txnList = []
while (len(txnBuffer) > 0) & (len(txnList) < blockSizeLimit):
newTxn = txnBuffer.pop()
validTxn = isValidTxn(newTxn,state) # This will return False if txn is invalid
if validTxn: # If we got a valid state, not 'False'
txnList.append(newTxn)
state = updateState(newTxn,state)
else:
print("ignored transaction")
sys.stdout.flush()
continue # This was an invalid transaction; ignore it and move on
## Make a block
myBlock = makeBlock(txnList,chain)
chain.append(myBlock)
In [11]:
chain[0]
Out[11]:
In [12]:
chain[1]
Out[12]:
우리가 예상한대로 'genesis block'에 계좌의 잔금을 초기화하는(?), 정상적이지 않은 거래내역(갑자기 토큰이 생성되는)이 포함되게 됩니다. 부모 블록의 해쉬는 자식 블록에서 참고되어지며 자식 블록은 시스템 상태에 영향을 미치는 새로운 거래내역을 포함하게 됩니다. 이제 우리는 거래내역들이 모두 업데이트된 결과를 확인할 수 있습니다.
In [13]:
state
Out[13]:
'정보보안' 카테고리의 다른 글
파이썬으로 나만의 블록체인 만들기 #4 (0) | 2017.11.16 |
---|---|
파이썬으로 나만의 블록체인 만들기 #3 (0) | 2017.11.16 |
파이썬으로 나만의 블록체인 만들기 #1 (0) | 2017.11.14 |
OLE 파일 구조의 이해 (0) | 2012.09.11 |
정보보안? 정보보호? (0) | 2011.08.08 |