Spaces:
Sleeping
Sleeping
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 | |
def last_block(self): | |
""" | |
체μΈμ λ§μ§λ§ λΈλ‘ λ°ν | |
""" | |
return self.chain[-1] | |
def hash(block): | |
""" | |
λΈλ‘μ SHA-256μΌλ‘ ν΄μ± | |
:param block: λΈλ‘ | |
:return: ν΄μ κ° | |
""" | |
block_string = json.dumps(block, sort_keys=True).encode() | |
return hashlib.sha256(block_string).hexdigest() |