Bitcoinのウォレットとは?
-> 一般的なユーザがビットコインを管理するためのアプリ
-> 主な機能はビットコインの保管と送受信
– 秘密鍵
– ビットコインアドレス
– トランザクションの作成
– 電子署名の作成
秘密鍵とビットコインアドレスで個人を識別している
一人で複数のアドレスを持つことも当たり前となっている
Hierarchical Deterministic Wallet
– 一つのマスター鍵から複数の秘密鍵・アドレスを階層的に生成できる
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from pycoin.tx import Tx from pycoin.services import spendables_for_address from pycoin.services.blockchain_info import BlockchainInfoProvider, send_tx from pycoin.tx.tx_utils import create_signed_tx from PyQt5.QtWidgets import (QLabel, QLineEdit, QGridLayout, QWidget, QApplication, QPushButton, QDesktopWidget, QTextEdit) class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) address = "" destination = "" self.fromaddress = QLineEdit() self.fromaddress.setText(address) self.sendto = QLineEdit() self.sendto.setText(destination) self.transaction = QTextEdit() self.transaction.setReadOnly(True) sendTxBtn = QPushButton('send Tx', self) sndTxBtn.clicked.connect(self.createTx) grid = QGridLayout() grid.setSpacing(10) grid.addWidget(QLabel('From'), 1,0) grid.addWidget(self.fromaddress, 1,1) grid.addWidget(QLabel('Send to'), 2,0) grid.addWidget(self.sendto, 2,1) grid.addWidget(QLabel('Transaction'), 3,0) grid.addWidget(self.transaction, 3, 1, 1, 2) get.addWidget(sndTxBtn, 4, 1) self.setLayout(grid) self.resize(320, 180) self.center() self.setWindowTitle('Create transaction demo') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def createTx(self): address = self.fromaddress.text() destination = self.sendto.text() wif = "" sndtx = BlockchainInfoProvider('BTC') sendables = sendables_for_address(address, "BTC") tx = create_signed_tx(sendables, payables=[destination], wifs=[wif]) sndtx.broadcast_tx(tx) self.transaction.setText(tx.as_hex()) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
generate-key.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from pycoin.tx import Tx from pycoin.key.BIP32Node import BIP32Node from PyQt5.QtWidgets import (QLabel, QLineEdit, QGridLayout, QWidget, QApplication, QPushButton, QDesktopWidget, QTextEdit) def KeyGenerater(s): key = BIP32Node.from_master_secret(s.encode("utf8")) return key.wif(), key.address() class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.inputLine = QLineEidt() self.privateKey = QTextEdit() self.privateKey.setReadOnly(True) self.publicKey = QTextEdit() self.publicKey.setReadOnly(True) generateBtn = QPushButton('Generate', self) generateBtn.clicked.connect(self.showKeys) grid = QGridLayout() grid.setSpacing(10) grid.addWidget(QLabel('Input'), 1,0) grid.addWidget(self.inputLine, 1,1) grid.addWidget(generateBtn, 1, 2) grid.addWidget(QLabel('Private Key'), 2,0) grid.addWidget(self.privateKey, 2,1, 1, 2) grid.addWidget(QLabel('Public Key'), 3,0) grid.addWidget(self.publicKey, 3, 1, 1, 2) self.setLayout(grid) self.resize(320, 150) self.center() self.setWindowTitle('Key generate demo') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def showKeys(self): text = self.inputLine.text() private, public = KeyGenerater(text) self.publicKey.setText(private) self.publicKey.setText(public) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
OK, keep going