Marek Palatinus Wiki -

BIP: 44 Layer: Applications Title: Multi-Account Hierarchy for Deterministic Wallets Author: Marek Palatinus Pavol Rusnak Comments-Summary: Mixed review (one person) Comments-URI: Status: Proposed

This file is part of the Trezor project.

Copyright (C) 2012-2018 SatoshiLabs and contributors

This library is free software: you can redistribute it and/or modify

it under the terms of the GNU Lesser General Public License version 3

as published by the Free Software Foundation.

This library is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of


GNU Lesser General Public License for more details.

You should have received a copy of the License along with this library.

If not, see

import binascii import functools import getpass import logging import os import sys import time import warnings
from mnemonic import Mnemonic
from . import ( btc, cosi, debuglink, device, ethereum, firmware, lisk, mapping, messages as proto, misc, nem, stellar, tools, )
if sys.version_info.major < 3: raise Exception("Trezorlib does not support Python 2 anymore.")
SCREENSHOT = False LOG = logging.getLogger(name)

make a getch function

try: import termios import tty
# POSIX system. Create and return a getch that manipulates the tty. # On Windows, termios will fail to import.
def getch(): fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(fd) ch = finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch
except ImportError: # Windows system. # Use msvcrt's getch function. import msvcrt
def getch(): while True: key = msvcrt.getch() if key in (0x00, 0xe0): # skip special keys: read the scancode and repeat msvcrt.getch() continue return key.decode()
def get_buttonrequest_value(code): # Converts integer code to its string representation of ButtonRequestType return [ k for k in dir(proto.ButtonRequestType) if getattr(proto.ButtonRequestType, k) == code ][0]
class PinException(tools.CallException): pass
class MovedTo: """Deprecation redirector for methods that were formerly part of TrezorClient"""
def init(self, where): self.where = where = where.module + "." +
def _deprecated_redirect(self, client, args, *kwargs): """Redirector for a deprecated method on TrezorClient""" warnings.warn( "Function has been moved to %s" %, DeprecationWarning, stacklevel=2, ) return self.where(client, args, *kwargs)
def get(self, instance, cls): if instance is None: return self._deprecated_redirect else: return functools.partial(self._deprecated_redirect, instance)
class BaseClient(object): # Implements very basic layer of sending raw protobuf # messages to device and getting its response back. def init(self, transport, *kwargs):"creating client instance for device: {}".format(transport.getpath())) self.transport = transport super(BaseClient, self).init_() # *args, *kwargs)
def close(self): pass
def cancel(self): self.transport.write(proto.Cancel())
@tools.session def callraw(self, msg): tracebackhide_ = True # for pytest # pylint: disable=W0612 self.transport.write(msg) return
@tools.session def call(self, msg): resp = self.callraw(msg) handler_name = "callback%s" % handler = getattr(self, handler_name, None)
if handler is not None: msg = handler(resp) if msg is None: raise ValueError( "Callback %s must return protobuf message, not None" % handler ) resp =
return resp
def callback_Failure(self, msg): if msg.code in ( proto.FailureType.PinInvalid, proto.FailureType.PinCancelled, proto.FailureType.PinExpected, ): raise PinException(msg.code, msg.message)
raise tools.CallException(msg.code, msg.message)
def register_message(self, msg): """Allow application to register custom protobuf message type""" mapping.register_message(msg)
class TextUIMixin(object): # This class demonstrates easy test-based UI # integration between the device and wallet. # You can implement similar functionality # by implementing your own GuiMixin with # graphical widgets for every type of these callbacks.
def init(self, args, *kwargs): super(TextUIMixin, self).init(args, *kwargs)
@staticmethod def print(text): print(text, file=sys.stderr)
def callback_ButtonRequest(self, msg): # log("Sending ButtonAck for %s " % get_buttonrequest_value(msg.code)) return proto.ButtonAck()
def callback_RecoveryMatrix(self, msg): if self.recovery_matrix_first_pass: self.recovery_matrix_first_pass = False self.print( "Use the numeric keypad to describe positions. For the word list use only left and right keys." ) self.print("Use backspace to correct an entry. The keypad layout is:") self.print(" 7 8 9 7 | 9") self.print(" 4 5 6 4 | 6") self.print(" 1 2 3 1 | 3") while True: character = getch() if character in ("\x03", "\x04"): return proto.Cancel()
if character in ("\x08", "\x7f"): return proto.WordAck(word="\x08")
# ignore middle column if only 6 keys requested. if msg.type == proto.WordRequestType.Matrix6 and character in ( "2", "5", "8", ): continue
if character.isdigit(): return proto.WordAck(word=character)
def callback_PinMatrixRequest(self, msg): if msg.type == proto.PinMatrixRequestType.Current: desc = "current PIN" elif msg.type == proto.PinMatrixRequestType.NewFirst: desc = "new PIN" elif msg.type == proto.PinMatrixRequestType.NewSecond: desc = "new PIN again" else: desc = "PIN"
self.print( "Use the numeric keypad to describe number positions. The layout is:" ) self.print(" 7 8 9") self.print(" 4 5 6") self.print(" 1 2 3") self.print("Please enter %s: " % desc) pin = getpass.getpass("") if not pin.isdigit(): raise ValueError("Non-numerical PIN provided") return proto.PinMatrixAck(pin=pin)
def callback_PassphraseRequest(self, msg): if msg.on_device is True: return proto.PassphraseAck()
if os.getenv("PASSPHRASE") is not None: self.print("Passphrase required. Using PASSPHRASE environment variable.") passphrase = Mnemonic.normalize_string(os.getenv("PASSPHRASE")) return proto.PassphraseAck(passphrase=passphrase)
self.print("Passphrase required: ") passphrase = getpass.getpass("") self.print("Confirm your Passphrase: ") if passphrase == getpass.getpass(""): passphrase = Mnemonic.normalize_string(passphrase) return proto.PassphraseAck(passphrase=passphrase) else: self.print("Passphrase did not match! ") exit()
def callback_PassphraseStateRequest(self, msg): return proto.PassphraseStateAck()
def callback_WordRequest(self, msg): if msg.type in (proto.WordRequestType.Matrix9, proto.WordRequestType.Matrix6): return self.callback_RecoveryMatrix(msg) self.print("Enter one word of mnemonic: ") word = input() if self.expand: word = self.mnemonic_wordlist.expand_word(word) return proto.WordAck(word=word)
class DebugLinkMixin(object): # This class implements automatic responses # and other functionality for unit tests # for various callbacks, created in order # to automatically pass unit tests. # # This mixing should be used only for purposes # of unit testing, because it will fail to work # without special DebugLink interface provided # by the device. DEBUG = LOG.getChild("debug_link").debug
def init(self, args, *kwargs): super(DebugLinkMixin, self).init(args, *kwargs) self.debug = None self.in_with_statement = 0 self.button_wait = 0 self.screenshot_id = 0
# Always press Yes and provide correct pin self.setup_debuglink(True, True)
# Do not expect any specific response from device self.expected_responses = None
# Use blank passphrase self.set_passphrase("")
def close(self): super(DebugLinkMixin, self).close() if self.debug: self.debug.close()
def set_debuglink(self, debug_transport): self.debug = debuglink.DebugLink(debug_transport)
def set_buttonwait(self, secs): self.button_wait = secs
def enter(self): # For usage in with/expected_responses self.in_with_statement += 1 return self
def exit(self, _type, value, traceback): self.in_with_statement -= 1
if _type is not None: # Another exception raised return False
# return isinstance(value, TypeError) # Evaluate missed responses in 'with' statement if self.expected_responses is not None and len(self.expected_responses): raise RuntimeError( "Some of expected responses didn't come from device: %s" % [repr(x) for x in self.expected_responses] )
# Cleanup self.expected_responses = None return False
def set_expected_responses(self, expected): if not self.in_with_statement: raise RuntimeError("Must be called inside 'with' statement") self.expected_responses = expected
def setup_debuglink(self, button, pin_correct): self.button = button # True -> YES button, False -> NO button self.pin_correct = pin_correct
def set_passphrase(self, passphrase): self.passphrase = Mnemonic.normalize_string(passphrase)
def set_mnemonic(self, mnemonic): self.mnemonic = Mnemonic.normalize_string(mnemonic).split(" ")
def callraw(self, msg): tracebackhide_ = True # for pytest # pylint: disable=W0612
if SCREENSHOT and self.debug: from PIL import Image
layout = self.debug.read_layout() im ="RGB", (128, 64)) pix = im.load() for x in range(128): for y in range(64): rx, ry = 127 - x, 63 - y if (ord(layout[rx + (ry / 8) * 128]) & (1 << (ry % 8))) > 0: pix[x, y] = (255, 255, 255)"scr%05d.png" % self.screenshot_id) self.screenshot_id += 1
resp = super(DebugLinkMixin, self).call_raw(msg) self._check_request(resp) return resp
def check_request(self, msg): tracebackhide_ = True # for pytest # pylint: disable=W0612
if self.expected_responses is not None: try: expected = self.expected_responses.pop(0) except IndexError: raise AssertionError( proto.FailureType.UnexpectedMessage, "Got %s, but no message has been expected" % repr(msg), )
if msg.class != expected.class: raise AssertionError( proto.FailureType.UnexpectedMessage, "Expected %s, got %s" % (repr(expected), repr(msg)), )
for field, value in expected.dict.items(): if value is None or value == []: continue if getattr(msg, field) != value: raise AssertionError( proto.FailureType.UnexpectedMessage, "Expected %s, got %s" % (repr(expected), repr(msg)), )
def callback_ButtonRequest(self, msg): self.DEBUG("ButtonRequest code: " + get_buttonrequest_value(msg.code))
self.DEBUG("Pressing button " + str(self.button)) if self.button_wait: self.DEBUG("Waiting %d seconds " % self.button_wait) time.sleep(self.button_wait) self.debug.press_button(self.button) return proto.ButtonAck()
def callback_PinMatrixRequest(self, msg): if self.pin_correct: pin = self.debug.read_pin_encoded() else: pin = "444222" return proto.PinMatrixAck(pin=pin)
def callback_PassphraseRequest(self, msg): self.DEBUG("Provided passphrase: '%s'" % self.passphrase) return proto.PassphraseAck(passphrase=self.passphrase)
def callback_PassphraseStateRequest(self, msg): return proto.PassphraseStateAck()
def callback_WordRequest(self, msg): (word, pos) = self.debug.read_recovery_word() if word != "": return proto.WordAck(word=word) if pos != 0: return proto.WordAck(word=self.mnemonic[pos - 1])
raise RuntimeError("Unexpected call")
class ProtocolMixin(object): VENDORS = ("", "")
def init(self, state=None, args, *kwargs): super(ProtocolMixin, self).init(args, *kwargs) self.state = state self.init_device() self.tx_api = None
def set_tx_api(self, tx_api): self.tx_api = tx_api
def init_device(self): init_msg = proto.Initialize() if self.state is not None: init_msg.state = self.state self.features = tools.expect(proto.Features)( if str(self.features.vendor) not in self.VENDORS: raise RuntimeError("Unsupported device")
@staticmethod def expand_path(n): warnings.warn( "expand_path is deprecated, use tools.parse_path", DeprecationWarning, stacklevel=2, ) return tools.parse_path(n)
@tools.expect(proto.Success, field="message") def ping( self, msg, button_protection=False, pin_protection=False, passphrase_protection=False, ): msg = proto.Ping( message=msg, button_protection=button_protection, pin_protection=pin_protection, passphrase_protection=passphrase_protection, ) return
def get_device_id(self): return self.features.device_id
def _prepare_sign_tx(self, inputs, outputs): tx = proto.TransactionType() tx.inputs = inputs tx.outputs = outputs
txes = {None: tx}
for inp in inputs: if inp.prev_hash in txes: continue
if inp.script_type in ( proto.InputScriptType.SPENDP2SHWITNESS, proto.InputScriptType.SPENDWITNESS, ): continue
if not self.tx_api: raise RuntimeError("TX_API not defined")
prev_tx = self.tx_api.get_tx(binascii.hexlify(inp.prev_hash).decode()) txes[inp.prev_hash] = prev_tx
return txes
@tools.expect(proto.Success, field="message") def clear_session(self): return
# Device functionality wipe_device = MovedTo(device.wipe) recovery_device = MovedTo(device.recover) reset_device = MovedTo(device.reset) backup_device = MovedTo(device.backup)
# debugging load_device_by_mnemonic = MovedTo(debuglink.load_device_by_mnemonic) load_device_by_xprv = MovedTo(debuglink.load_device_by_xprv) self_test = MovedTo(debuglink.self_test)
set_u2f_counter = MovedTo(device.set_u2f_counter)
apply_settings = MovedTo(device.apply_settings) apply_flags = MovedTo(device.apply_flags) change_pin = MovedTo(device.change_pin)
# Firmware functionality firmware_update = MovedTo(firmware.update)
# BTC-like functionality get_public_node = MovedTo(btc.get_public_node) get_address = MovedTo(btc.get_address) sign_tx = MovedTo(btc.sign_tx) sign_message = MovedTo(btc.sign_message) verify_message = MovedTo(btc.verify_message)
# CoSi functionality cosi_commit = MovedTo(cosi.commit) cosi_sign = MovedTo(cosi.sign)
# Ethereum functionality ethereum_get_address = MovedTo(ethereum.get_address) ethereum_sign_tx = MovedTo(ethereum.sign_tx) ethereum_sign_message = MovedTo(ethereum.sign_message) ethereum_verify_message = MovedTo(ethereum.verify_message)
# Lisk functionality lisk_get_address = MovedTo(lisk.get_address) lisk_get_public_key = MovedTo(lisk.get_public_key) lisk_sign_message = MovedTo(lisk.sign_message) lisk_verify_message = MovedTo(lisk.verify_message) lisk_sign_tx = MovedTo(lisk.sign_tx)
# NEM functionality nem_get_address = MovedTo(nem.get_address) nem_sign_tx = MovedTo(nem.sign_tx)
# Stellar functionality stellar_get_address = MovedTo(stellar.get_address) stellar_sign_transaction = MovedTo(stellar.sign_tx)
# Miscellaneous cryptographic functionality get_entropy = MovedTo(misc.get_entropy) sign_identity = MovedTo(misc.sign_identity) get_ecdh_session_key = MovedTo(misc.get_ecdh_session_key) encrypt_keyvalue = MovedTo(misc.encrypt_keyvalue) decrypt_keyvalue = MovedTo(misc.decrypt_keyvalue)
class TrezorClient(ProtocolMixin, TextUIMixin, BaseClient): def init(self, transport, args, *kwargs): super().init(transport=transport, args, *kwargs)
class TrezorClientDebugLink(ProtocolMixin, DebugLinkMixin, BaseClient): def init(self, transport, args, *kwargs): super().init(transport=transport, args, *kwargs) Desktop version
submitted by REWADEE25 to u/REWADEE25 [link] [comments]

Marek Palatinus - SatoshiLabs - & Slush Pool Marek Palatinus, Trezor - The European Bitcoin Convention -- 2013 Amsterdam Bitcoin: Jak podniká Marek Palatinus - YouTube Or Lokay Cohen Bittax VP interview with Satoshi Labs Co-founder and CEO Marek Palatinus “Slush” Mining For The Average Joe by Tone Vays, JamesHillard, JanCapek, MarekPalatinus, PavelMoravec

I'm Marek Palatinus (slush), creator of the first mining pool and creator of TREZOR. AMA - 3rd Dec! Forum rules The more people that are involved, the more interesting this AMA series will be for everyone. Please help spread the word of this amazing AMA series on your own social media. (YES, EVEN YOURS!) Short URL: Hashtag: #BTCAMA When the AMAs are finished, all the answers ... Bitcoin scalability debate []. Bitcoin Cash is the outcome of a long debate over Bitcoin Core's scalability problem.. On the Bitcoin blockchain, blocks can carry a maximum of 1mb of transaction data.This limit was originally intended to prevent attacks where a massive bundle of transactions might be issued in order to weaken the network under its weight. Die Hardware-Geldbörse von Trezor verwendet sowohl Bitcoin Cash- als auch Bcash-Kryptowährungsnamen. Sein Architekt Marek "Slush" Palatinus erklärte: "Der Grund, warum wir 'Bcash' verwenden, besteht darin, Benutzer davor zu schützen, versehentlich die falsche Brieftasche zu benutzen.» Einstellung von Gemeinschaft und Perspektiven limit my search to r/Bitcoin. use the following search parameters to narrow your results: subreddit:subreddit find submissions in "subreddit" author:username find submissions by "username" find submissions from "" url:text search for "text" in url selftext:text search for "text" in self post contents self:yes (or self:no) include (or exclude) self posts nsfw:yes (or ... /r/btc was created to foster and support free and open Bitcoin discussion, Bitcoin news, and exclusive AMA (Ask Me Anything) interviews from top...

[index] [48101] [3072] [33352] [50590] [9398] [48077] [41649] [18823] [17699] [27860]

Marek Palatinus - SatoshiLabs - & Slush Pool

Přednášející Marek Palatinus, který je propagátorem a gestorem tohoto projektu v českých zemích, představuje alternativní digitální měnu Bitcoin, která narozdíl od většiny měn ... Marek Palatinus, Pavol Rusnák - Trezor, hardwarová peneženka pro Bitcoin ... Bitcoin: Jak podniká Marek Palatinus - Duration: 26:40. Na volné noze 29,883 views. 26:40. Michal Špaček ... Hosťom bol Marek Palatinus známi pod prezývkou Slush. Rozprávali sme sa o ha... Skip navigation Sign in. Search. Loading... Close. This video is unavailable. Watch Queue Queue . Watch Queue ... Part of the CoinWisdom Sofia conference held on 5/6 Dec 2014 For more info - Druhá najrevolučnejšia vec od dôb spustenia internetu - digitálna mena bitcoin ( bit + coin - minca ) je decentralizovaná nikým nemanipulovatelná kryptocurre...