electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 46c290e30deab3726321bc224724cb87fc27d8ec
parent c427e085b3d193723c49432c187d7d3704f2660d
Author: ThomasV <thomasv@gitorious>
Date:   Thu, 26 Feb 2015 13:59:29 +0100

use base43 in order to send transactions by QR code

Diffstat:
Mgui/qt/main_window.py | 4++--
Mgui/qt/transaction_dialog.py | 4++--
Mlib/bitcoin.py | 47+++++++++++++++++++++++++----------------------
3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py @@ -2240,8 +2240,8 @@ class ElectrumWindow(QMainWindow): return # else if the user scanned an offline signed tx # transactions are binary, but qrcode seems to return utf8... - import base64 - z = base64.b64decode(data.decode('utf8')) + data = data.decode('utf8') + z = bitcoin.base_decode(data, length=None, base=43) data = ''.join(chr(ord(b)) for b in z).encode('hex') tx = self.tx_from_text(data) if not tx: diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py @@ -34,6 +34,7 @@ from PyQt4.QtCore import * import PyQt4.QtCore as QtCore from electrum import transaction +from electrum.bitcoin import base_encode from electrum.plugins import run_hook from util import MyTreeWidget @@ -108,9 +109,8 @@ class TxDialog(QDialog): def show_qr(self): - import base64 text = self.tx.raw.decode('hex') - text = base64.b64encode(text) + text = base_encode(text, base=43) try: self.parent.show_qrcode(text, 'Transaction') except Exception as e: diff --git a/lib/bitcoin.py b/lib/bitcoin.py @@ -239,73 +239,76 @@ def hash_160_to_bc_address(h160, addrtype = 0): vh160 = chr(addrtype) + h160 h = Hash(vh160) addr = vh160 + h[0:4] - return b58encode(addr) + return base_encode(addr, base=58) def bc_address_to_hash_160(addr): - bytes = b58decode(addr, 25) + bytes = base_decode(addr, 25, base=58) return ord(bytes[0]), bytes[1:21] __b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' -__b58base = len(__b58chars) +assert len(__b58chars) == 58 +__b43chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$*+-./:' +assert len(__b43chars) == 43 -def b58encode(v): - """ encode v, which is a string of bytes, to base58.""" +def base_encode(v, base): + """ encode v, which is a string of bytes, to base58.""" + if base == 58: + chars = __b58chars + elif base == 43: + chars = __b43chars long_value = 0L for (i, c) in enumerate(v[::-1]): long_value += (256**i) * ord(c) - result = '' - while long_value >= __b58base: - div, mod = divmod(long_value, __b58base) - result = __b58chars[mod] + result + while long_value >= base: + div, mod = divmod(long_value, base) + result = chars[mod] + result long_value = div - result = __b58chars[long_value] + result - + result = chars[long_value] + result # Bitcoin does a little leading-zero-compression: # leading 0-bytes in the input become leading-1s nPad = 0 for c in v: if c == '\0': nPad += 1 else: break - - return (__b58chars[0]*nPad) + result + return (chars[0]*nPad) + result -def b58decode(v, length): +def base_decode(v, length, base): """ decode v into a string of len bytes.""" + if base == 58: + chars = __b58chars + elif base == 43: + chars = __b43chars long_value = 0L for (i, c) in enumerate(v[::-1]): - long_value += __b58chars.find(c) * (__b58base**i) - + long_value += chars.find(c) * (base**i) result = '' while long_value >= 256: div, mod = divmod(long_value, 256) result = chr(mod) + result long_value = div result = chr(long_value) + result - nPad = 0 for c in v: - if c == __b58chars[0]: nPad += 1 + if c == chars[0]: nPad += 1 else: break - result = chr(0)*nPad + result if length is not None and len(result) != length: return None - return result def EncodeBase58Check(vchIn): hash = Hash(vchIn) - return b58encode(vchIn + hash[0:4]) + return base_encode(vchIn + hash[0:4], base=58) def DecodeBase58Check(psz): - vchRet = b58decode(psz, None) + vchRet = base_decode(psz, None, base=58) key = vchRet[0:-4] csum = vchRet[-4:] hash = Hash(key)