오늘 구현할 알고리즘은 다음과 같다.
** 이 체인과 2체인이 다른 경우에 길이가 긴 체인이 맞는 체인
. 새로운노드를 구성시킬 땐 다른 포트를 사용 ex 5000 > 5001 > 파이썬 실행 > 각각의 노드들을 각 레지스터들끼리 체인을 비교하는 방식을 활용할 것임. 이렇게 구동되기 위해서 어떻게 코드를 짜야하는 지 해볼 것임.
def __init__(self):
self.chain = []
self.current_transaction = []
self.nodes = set()
self.new_block(previous_hash=1, proof=100)
그리고 이제 init 형태를 초기화 까지 ㄴ진행이 됐다면, node를 저장을 할 건데, 그 부분이 register_node. 메서드.
def register_node(self, address):
parsed_url = urlparse(address)
self.nodes.add(parsed_url.netloc)
알고가기) 여기서 node의 개념:
def valid_chain(self, chain):
last_block = chain[0] # 첫 번째 제네시스 블록이 저장됨
current_index = 1
while current_index < len(chain):
block = chain[current_index]
print('%s', % last_block)
print('%s', % block)
print("\n---------\n")
---------------------------------
#check that the hash of the block is correct
# 해시값 비교, 검증
if block['previous_hash'] != self.hash(last_block):
return False
last_block = block
current_index += 1
return True
def resolve_conflicts(self):
# 구동되는 이웃 노드들을 다 넣는다
neighbours = self.nodes #각 노드들을 저장하는 neighbours
new_chain = None
max_length = len(self.chain) #Our chain length
for node in neighbours:
tmp_url = 'http:// + str(node) + '/chain' # url을 받아서 request를 통해 체인 정보 저장
response = requests.get(tmp_url)
if response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
if length > max_length and self.valid_chain(chain): # 긴 체인을 선택하게 됨
max_length = length
if new_chain:
self.chain = new_chain
return True
return False
@app.route('/nodes/register', methods=['POST'])
def register_nodes():
values = request.get_json()
nodes = values.get('nodes')
if nodes i None: #Bad Request 400
return "Error: Please supply a valid list of nodes", 400
for node in nodes:
blockchain.register_node(node)
response = {
'message' = ' New nodes have been added',
'total_nodes': list(blockchain.nodes),
}
return jsonify(response), 201
blockcahin.resolve_conflict > 반환값이 들어가고, bool결과를 통해 해당 값이 우리게 맞는 체인이다 아니다 하는 알림메시지가 나올것 (if replace, else)
def new_transaction(self,sender,recipient,amount):
self.current_transaction.append(
{
'sender' : sender, # 송신자
'recipient' : recipient, #수신자
'amount' : amount #얼마 보낼지
}
)
@property
def last_block(self):
return self.chain[-1]
def pow(self, last_proof):
proof = 0
while self.valid_proof(last_proof, proof) is False:
proof += 1
return proof
https://www.daleseo.com/python-property/ 참고해서 getter,setter, 데코레이터 쓸때 각각 비교해보기.
def valid_proof(last_proof, proof):
guess = str(last_proof + proof).encode()
guess_hash = hashlib.sha256(guess).hexdigest()
return guess_hash[:4] == " 0000 "