===== News =====
* https://www.technologyreview.com/s/609771/a-cryptocurrency-without-a-blockchain-has-been-built-to-outperform-bitcoin/
===== Theorie =====
* Hashfunktion: https://de.wikipedia.org/wiki/Kryptologische_Hashfunktion
* Asymmetrische Kryptographie: https://de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
* Public-Key Verschlüsselung: https://de.wikipedia.org/wiki/Public-Key-Verschl%C3%BCsselungsverfahren
* RSA-Verschlüsselung: https://de.wikipedia.org/wiki/RSA-Kryptosystem
* Blockchain: https://de.wikipedia.org/wiki/Blockchain
===== BadBlockChain =====
{{ :efinf:blcks2017:crypto:badblockchain.zip |BadBlockChain in Python}}
==== Format eines BadBlocks ====
5 # Nummer des Blocks
98 # Hash vom Vorgängerblock
1 # Anzahl Transactions
1513199769622,7630423873,8565935687,40,2478293393
8565935687,3747393 # Öffentlicher Schlüssel vom Miner, Nonce so, dass Hash(block) < difficulty (2^10).
==== Transaction ====
1513199769622,7630423873,8565935687,40,2478293393
Timestamp (ms seit 1.1.1970),
Public Key vom Sender,
Public Key vom Empfänger,
Betrag der überwiesen wird,
Digitale Unterschrift vom Sender
=== Unterschrift ===
Man bildet den Hash $h$ der Transaction (ohne ',Unterschrift').
$h$ wird mit PrivateKey vom Sender verschlüsselt.
Verfizierung: Hash $h$ bilden, und Unterschrift mit PublicKey vom Sender entschlüsseln, beide Werte müssen gleich sein.
==== RSA ====
Sei n eine Zahl, der Modulus.
Rechnen mit Resten modulo n: Alle Resultate werden durch n geteilt und der Rest genommen.
$a^x \mod n = b$ kann nicht effizient nach $x$ aufgelöst werden, d.h. der diskrete Logarithmus ist nicht effizient berechenbar.
RSA: öffentlicher Modulus $m$, öffentlicher Exponent $e$, privater Exponent $p$.
Clou: $\left(a^e\right)^p = a = \left(a^p\right)^e = a^{e\cdot p} \mod m$.
===== Anwendung BadBlockChain =====
=== Key Management ===
Key Erzeugen:
from badkeymaterial import BadKeyMaterial
print BadKeyMaterial(32)
Ausgabe z.B.
Public modulus: 4906493971 public exponent: 31 private exponent: 158269471
Key verwenden:
from badkeymaterial import BadKeyMaterial
# modulus eintragen
k=BadKeyMaterial(4906493971)
# privaten Schlüssel setzen
k.private = 158269471
Mining:
from badblockchain import BadBlockChain
from badkeymaterial import BadKeyMaterial
c = BadBlockChain()
c.getNewBlocks() # Blockchain import
# modulus eintragen
k=BadKeyMaterial(4906493971)
# privaten Schlüssel setzen
k.private = 158269471
c.mine(k.modulus)
print c.wallets.wallets
Neue Hash-Funktion:
# 32-Bit Hash
@classmethod
def badHash(cls,x):
x = str(x)
h = 0xdeadbeef
for i in xrange(0,len(x)):
h = ((h+6543)*(ord(x[i])+57361)+567) % 2**32
return h