Пример #1
0
def init():
    # 删除旧文件
    if os.path.isfile(STORE_BLC_FILE_PATH):
        os.remove(STORE_BLC_FILE_PATH)
    if os.path.isfile(STORE_KEYS_FILE_PATH):
        os.remove(STORE_KEYS_FILE_PATH)
    # 打开N服务和B服务
    NetworkRouting.get_instance().start_server()
    FullBlockChain.get_instance().start_server()
    # 添加创世区块
    keys = [UserKey() for i in range(10)]
    for key in keys:
        Wallet.get_instance().add_key(key)
    Miner.get_instance().set_wallet_address(keys[0].get_address())
    t = Transaction()
    for key in keys:
        t.add_output(TransOutput(Btc("1000"), key.get_address()))
    block = Block(1)
    block.add_transaction(t)
    head_trans = Transaction()
    head_trans.add_output(TransOutput(Btc(MINING_BTCS), keys[0].get_address()))
    block.set_head_transaction(head_trans)
    block.find_randnum()
    FullBlockChain.get_instance().add_first_block(block)
    Wallet.get_instance().write_keys_to_file()
Пример #2
0
 def __mining(self) -> Optional[Block]:
     """挖矿"""
     trans_list = self.__get_mining_trans()
     with FullBlockChain.safe_use_blockchain() as blc:
         block = Block(blc.get_height() + 1, blc.get_top_hash())
     # 计算总交易费
     fee = Btc("0")
     for trans in trans_list:
         fee += blc.compute_transaction_fee(trans)
         block.add_transaction(trans)  # 添加交易到block中
     # 加上矿工奖励
     fee += block.get_now_ming_btcs()
     # 构造创块交易
     head_trans = Transaction()
     head_trans.add_output(TransOutput(address=self.address, btcs=fee))
     block.set_head_transaction(head_trans)
     # 正式开始挖矿
     while not block.veri_hash():
         if self.mine_flag:
             block.randnum += MINING_ADD_NUM
             block.timestap = time.time()
         else:  # 中止挖矿(失败了)
             self.add_trans(*trans_list)  # 把交易放回交易池
             return None
     return block
Пример #3
0
 def pay(self, pay_to: Dict[str, Btc]) -> Transaction:
     """向一个或多个地址付钱(生成一笔交易)"""
     pay_sum = Btc("0")
     for value in pay_to.values():  # 计算总的要付的钱
         pay_sum += value
     if self.lookup_balance() < pay_sum + self.trans_fee:  # 如果钱不够
         raise RuntimeError("number of btc is not enough!")
     # self.__sort_balance()
     address_set = set()
     pay_actually = Btc("0")
     t = Transaction()
     for address, btcs in pay_to.items():  # 添加交易输出
         t.add_output(TransOutput(address=address, btcs=btcs))
     for inp, outp in self.utxos.items():  # 添加交易输入
         address_set.add(outp.address)
         pay_actually += outp.btcs
         t.add_input(TransInput.load(inp))
         if pay_actually >= pay_sum + self.trans_fee:
             break
     pay_change = pay_actually - (pay_sum + self.trans_fee)  # 添加找零
     if pay_change != Btc("0"):
         user_key = UserKey()
         t.add_output(
             TransOutput(address=user_key.get_address(), btcs=pay_change))
         self.add_key(user_key)
     for address in address_set:  # 签名
         tap_key = self.get_key(address)
         if tap_key is None:
             raise RuntimeError("wallet balance info is out-of-date!")
         t.sign_transaction(tap_key)
     return t
Пример #4
0
from key import UserKey
from chain import Btc, TransOutput, TransInput, Transaction, Block, BlockChain
from config import MINING_BTCS
from verify import Verify

if __name__ == "__main__":
    print(BlockChain.__qualname__, BlockChain.get_instance.__qualname__)
    # 创建区块链
    bc = BlockChain.get_instance()
    print(bc.get_start_time())
    # 初始的两个用户
    key1 = UserKey()
    key2 = UserKey()
    # 初始区块的创币交易(只有输出,没有输入)
    t1 = Transaction()
    t1.add_output(TransOutput(Btc("5000"), key1.get_address()))
    t1.add_output(TransOutput(Btc("5000"), key2.get_address()))
    # 创世区块
    b1 = Block()
    b1.add_transaction(t1)
    # 添加矿工奖励交易
    mt1 = Transaction()
    mt1.add_output(TransOutput(Btc(MINING_BTCS), key1.get_address()))
    b1.set_head_transaction(mt1)
    b1.set_index(1)
    # 挖矿
    b1.find_randnum()
    # 添加区块
    bc.add_block(b1)
    # key1向key2转账
    t2 = Transaction()