
bitcoin hardware workshop
main.cpp@5:7aee17061c23, 2019-02-13 (annotated)
- Committer:
- stepansnigirev
- Date:
- Wed Feb 13 08:56:48 2019 +0000
- Revision:
- 5:7aee17061c23
- Parent:
- 4:9aec7b80e7a9
code
Who changed what in which revision?
User | Revision | Line number | New 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 | } |