api_for_unity / Blockchain.py
ldhldh's picture
Update Blockchain.py (#4)
79cf827
raw
history blame
3.63 kB
import hashlib
import json
from time import time
class Blockchain:
def __init__(self):
self.chain = []
self.current_transactions = []
self.user_wallets = {}
self.user_gpus = {}
# Genesis 블둝 생성
self.new_block(previous_hash="1")
def new_block(self, previous_hash=None):
"""
블둝체인에 μƒˆλ‘œμš΄ 블둝 μΆ”κ°€
:param previous_hash: 이전 λΈ”λ‘μ˜ ν•΄μ‹œ κ°’
:return: μƒˆλ‘œ μƒμ„±λœ 블둝
"""
for id, mem in self.user_gpus.items():
if id in self.user_wallets:
self.user_wallets[id] += mem//2
else:
self.user_wallets[id] = 10
self.user_wallets[id] += mem//2
block = {
'index': len(self.chain) + 1,
'timestamp': time(),
'transactions': self.current_transactions,
'previous_hash': previous_hash or self.hash(self.chain[-1]),
}
# ν˜„μž¬ νŠΈλžœμž­μ…˜ μ΄ˆκΈ°ν™”
self.current_transactions = []
# 블둝을 체인에 μΆ”κ°€
self.chain.append(block)
return block
def new_transaction(self, id, kind, data):
"""
μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜ 생성 및 μΆ”κ°€
id: μš”μ²­μž
kind: μš”μ²­ μ’…λ₯˜ (inference, add, out)
data: inference μ‹œ [μž…λ ₯ prompt, output], peer add μ‹œ gpu mem, out μ‹œ λ˜ν•œ gpu mem
return: ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ ν¬ν•¨ν•œ λΈ”λ‘μ˜ 인덱슀
"""
transaction = {
'id': id,
'kind': kind,
'data': data,
}
self.current_transactions.append(transaction)
# 각 μœ μ €μ˜ 행동λ ₯ μ—…λ°μ΄νŠΈ
if kind == "inference":
if id not in self.user_wallets:
# μƒˆλ‘œμš΄ μœ μ €μΈ 경우 초기 행동λ ₯ μ„€μ •
self.user_wallets[id] = 10 # 초기 행동λ ₯을 10으둜 μ„€μ •
self.user_wallets[id] -= 1
else:
# inference μš”μ²­ μ‹œ 차감
self.user_wallets[id] -= 1
if self.user_wallets[id]<0:
self.user_wallets[id] = 0
elif kind == "add":
if id not in self.user_gpus:
self.user_gpus[id] = int(data)
else:
self.user_gpus[id] += int(data)
elif kind == "out":
if id in self.user_gpus:
del(self.user_gpus[id])
return self.last_block['index'] + 1
def get_user_balance(self, id):
# νŠΉμ • μœ μ €μ˜ 행동λ ₯을 쑰회
return self.user_wallets.get(id, 10)
def get_user_gpu_mem(self, id):
# νŠΉμ • μœ μ €μ˜ κΈ°μ—¬ gpuλ₯Ό 쑰회
return self.user_gpus.get(id, 0)
def get_total_gpu_mem(self):
# 전체 λ©”λͺ¨λ¦¬ λ°˜ν™˜
result = 0
for mem in self.user_gpus.values():
result += int(mem)
return result
def get_total_coin(self):
# 전체 코인(행동λ ₯) 수 λ°˜ν™˜
result = 0
for coin in self.user_wallets.values():
result += int(coin)
return result
@property
def last_block(self):
"""
체인의 λ§ˆμ§€λ§‰ 블둝 λ°˜ν™˜
"""
return self.chain[-1]
@staticmethod
def hash(block):
"""
블둝을 SHA-256으둜 ν•΄μ‹±
:param block: 블둝
:return: ν•΄μ‹œ κ°’
"""
block_string = json.dumps(block, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()