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