bitcoin hardware workshop

Committer:
stepansnigirev
Date:
Wed Feb 13 08:56:48 2019 +0000
Revision:
5:7aee17061c23
Parent:
4:9aec7b80e7a9
code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stepansnigirev 0:e55c00c30c9a 1 #include <mbed.h>
stepansnigirev 5:7aee17061c23 2 #include "gui.h"
stepansnigirev 5:7aee17061c23 3 #include "Bitcoin.h"
stepansnigirev 5:7aee17061c23 4
stepansnigirev 5:7aee17061c23 5 /* to drop std:: part in the code */
stepansnigirev 5:7aee17061c23 6 using std::string;
stepansnigirev 0:e55c00c30c9a 7
stepansnigirev 0:e55c00c30c9a 8 GUI gui; /* our GUI instance */
stepansnigirev 0:e55c00c30c9a 9 Label lbl; /* label in the global scope, we will change text from the button callback */
stepansnigirev 5:7aee17061c23 10 QR qr; /* QR in the global scope, we will change text from the button callback */
stepansnigirev 5:7aee17061c23 11
stepansnigirev 5:7aee17061c23 12 /* we gonna use testnet here, will be used in address generation and key derivation */
stepansnigirev 5:7aee17061c23 13 /* to switch to the mainnet just change this to false */
stepansnigirev 5:7aee17061c23 14 #define USE_TESTNET true
stepansnigirev 5:7aee17061c23 15
stepansnigirev 5:7aee17061c23 16 /* init the key. handy tool: https://iancoleman.io/bip39/ */
stepansnigirev 5:7aee17061c23 17 HDPrivateKey hd("rhythm witness display knock head cable era exact submit boost exile seek topic pool sound", "my secret password");
stepansnigirev 5:7aee17061c23 18
stepansnigirev 5:7aee17061c23 19 /* init account key. We will use BIP84 to generate bech32 addresses */
stepansnigirev 5:7aee17061c23 20 /* derivation path is "m/84'/0'/0'" for mainnet and "m/84'/1'/0'" for testnet */
stepansnigirev 5:7aee17061c23 21 HDPrivateKey account = hd.hardenedChild(84).hardenedChild(USE_TESTNET).hardenedChild(0);
stepansnigirev 5:7aee17061c23 22
stepansnigirev 5:7aee17061c23 23 int change = 0; // 0 for receive addresses, 1 for change addresses
stepansnigirev 5:7aee17061c23 24 int current_child = 0;
stepansnigirev 0:e55c00c30c9a 25
stepansnigirev 5:7aee17061c23 26 /* button callback */
stepansnigirev 5:7aee17061c23 27 static lv_res_t addr_cb(lv_obj_t * btn){
stepansnigirev 5:7aee17061c23 28 Button b(btn);
stepansnigirev 5:7aee17061c23 29 int i = b.id();
stepansnigirev 5:7aee17061c23 30 if(i==2){ // change/receive button
stepansnigirev 5:7aee17061c23 31 change = !change;
stepansnigirev 5:7aee17061c23 32 }
stepansnigirev 5:7aee17061c23 33 current_child += i-2; /* we have id=1 and id=3, so we can use (id-2) to decrease or increase current child */
stepansnigirev 5:7aee17061c23 34 if(current_child < 0){
stepansnigirev 5:7aee17061c23 35 current_child = 0;
stepansnigirev 5:7aee17061c23 36 }
stepansnigirev 5:7aee17061c23 37 string addr = account.child(change).child(current_child).address()+"\n";
stepansnigirev 5:7aee17061c23 38 qr.text("bitcoin:"+addr);
stepansnigirev 5:7aee17061c23 39
stepansnigirev 5:7aee17061c23 40 char derivation_path[40];
stepansnigirev 5:7aee17061c23 41 sprintf(derivation_path, "\nm/84'/%d'/0'/%d/%d", USE_TESTNET, change, current_child);
stepansnigirev 5:7aee17061c23 42 addr += derivation_path;
stepansnigirev 5:7aee17061c23 43 lbl.text(addr);
stepansnigirev 5:7aee17061c23 44 return LV_RES_OK;
stepansnigirev 5:7aee17061c23 45 }
stepansnigirev 5:7aee17061c23 46
stepansnigirev 5:7aee17061c23 47 static lv_res_t xpub_cb(lv_obj_t * btn){
stepansnigirev 5:7aee17061c23 48 lbl.text(account.xpub());
stepansnigirev 5:7aee17061c23 49 qr.text(account.xpub());
stepansnigirev 2:59612fbf24d1 50 return LV_RES_OK;
stepansnigirev 0:e55c00c30c9a 51 }
stepansnigirev 0:e55c00c30c9a 52
stepansnigirev 0:e55c00c30c9a 53 int main() {
stepansnigirev 1:34addca10be4 54
stepansnigirev 0:e55c00c30c9a 55 gui.init();
stepansnigirev 0:e55c00c30c9a 56
stepansnigirev 5:7aee17061c23 57 /* Create a QR code to display addresses and xpub */
stepansnigirev 5:7aee17061c23 58 qr = QR(account.xpub());
stepansnigirev 5:7aee17061c23 59 qr.size(180);
stepansnigirev 5:7aee17061c23 60 qr.position(gui.width()/2+10, 10);
stepansnigirev 5:7aee17061c23 61
stepansnigirev 5:7aee17061c23 62 /* Create a label to display addresses and xpub */
stepansnigirev 5:7aee17061c23 63 lbl = Label(account.xpub());
stepansnigirev 5:7aee17061c23 64 lbl.size(gui.width()/2-10, 200);
stepansnigirev 5:7aee17061c23 65 lbl.position(5, 10);
stepansnigirev 4:9aec7b80e7a9 66 lbl.alignText(ALIGN_TEXT_CENTER);
stepansnigirev 0:e55c00c30c9a 67
stepansnigirev 5:7aee17061c23 68 Button next_btn(addr_cb, "Next");
stepansnigirev 5:7aee17061c23 69 next_btn.id(3);
stepansnigirev 5:7aee17061c23 70 next_btn.size(gui.width()/4-10, 50);
stepansnigirev 5:7aee17061c23 71 next_btn.position(gui.width()*3/4 + 5, gui.height() - 60);
stepansnigirev 5:7aee17061c23 72
stepansnigirev 5:7aee17061c23 73 Button prev_btn(addr_cb, "Previous");
stepansnigirev 5:7aee17061c23 74 prev_btn.id(1);
stepansnigirev 5:7aee17061c23 75 prev_btn.size(gui.width()/4-10, 50);
stepansnigirev 5:7aee17061c23 76 prev_btn.position(5, gui.height() - 60);
stepansnigirev 5:7aee17061c23 77
stepansnigirev 5:7aee17061c23 78 Button change_btn(addr_cb, "Receive / Change");
stepansnigirev 5:7aee17061c23 79 change_btn.id(2);
stepansnigirev 5:7aee17061c23 80 change_btn.size(gui.width()/4-10, 50);
stepansnigirev 5:7aee17061c23 81 change_btn.position(gui.width()/4 +5, gui.height() - 60);
stepansnigirev 5:7aee17061c23 82
stepansnigirev 5:7aee17061c23 83 Button xpub_btn(xpub_cb, "Show xpub");
stepansnigirev 5:7aee17061c23 84 xpub_btn.size(gui.width()/4-10, 50);
stepansnigirev 5:7aee17061c23 85 xpub_btn.position(gui.width()/2 + 5, gui.height() - 60);
stepansnigirev 0:e55c00c30c9a 86
stepansnigirev 0:e55c00c30c9a 87 while(1) {
stepansnigirev 0:e55c00c30c9a 88 gui.update();
stepansnigirev 0:e55c00c30c9a 89 }
stepansnigirev 1:34addca10be4 90 }