Bitmark Inc.
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    --- author: hsw tags: Autonomy-System, API, MVA --- # **Autonomy Architecture v2.0** **Release Date: 2021-AA-BB** - App - iOS - Android - Server (partially isolated user processes) - Transaction coordinator - Inter Pod messaging - Recovery - Contact list --- :::spoiler {state=open} CONTENTS [TOC] ::: ## Keys ### Overview * bitcoin keypairs * platform cosigner keypair * device keeps private key * recovery cosigner keypair * private key is sharded across at least * platform store * Bitmark store * contact store * gordian cosigner keypair * generated and kept in the Pod * auth keypair * created on device * sharded like recovery key * [encoding](#Appendix-Identification-Encoding) ### Reconstruction * APP - reload from: * platform store * Pod - rebuild from: * encrypted store containing: * gordian co-signer keypair * wallet file(s) (rebuild this from keypair+account maps if `wallet.dat` damaged) * list of account maps * backup of contact list ### Recovery * only necessary if: * platform store lost * Pod store lost * recovery key lost (i.e., less than m shards available) * reason to suspect a key was leaked (e.g., stolen device) * need to get back two shards to rebuild recovery keypair * then use the remaining key platform or gordian to sweep the funds to a new wallet * extra second protection is to add an additional key with one year time lock * if recovery key is used then the case of both platform and Pod store lost is covered if sufficient shards are recovered * transaction byte code allows UTXO spend for one of: * 2of3 multisig * single sig of extra key AND blockheight > limit * the _limit_ values will be set as the expected blockheight one year later ## Connections to other services * spotbit - current price information * coinbase API - fee estimation * coingecko - historical price * OneSignal - generic push notications * Apple App Store: check subscription info ## Postman Documentation [Autonomy API](<https://documenter.getpostman.com/view/59304/TVYGbxbg> "API on Postman") ## BACKLOG * Order of XPUBs for multisig (choose 1) 1. original fixed order: `multi(platform,recovery,gordian)` 2. use: `sortedmulti` - this may simplify recovery * Network Switching * provisioning: two separated keypairs * figure out startup sequence: 2× CreatePersonalAccount for test/main * wallet files multiple per network * API for APP to reboot to other network * Will the APP use same contact list for both networks? * RESEARCH: Need to add to gordian server and all-bitcoin-core 21+ to regtest and signet, signet schnorr ($10K changes to server, $5K changes to wallet to support 3+ networks, and $20K for initial schnorr) * Reconstruct * get old keys back: platform and Pod still usable * assumes no compromise * Add Contact: * Do simplified flow at the moment. ### Help needed from Blockchain Commons: * Authentication keypair * how to derive various identifiers? * where are the shards of the auth keypair stored? * TorGap * drop-in solution * can this replace the message server? * will whisper over Tor be used? * check the recovery sequence * also relates to recovering auth key to reconnect to Pod * are all conditions covered ## Block Diagrams ### System Architecture Overview ![SystemArchitecture](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/block/server/SystemAchitecture.png> "SystemArchitecture") **Description** * overview of the system structure * shows additional services as individual messaging clients * shows client side storage as replicated to its platform provider's cloud ### Pod Architecture ![PodArchitecture](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/block/server/PodArchitecture.png> "PodArchitecture") **Description** The system consists of the following components: * API handler - this handles the HTTPS interface from the APP and has a number of functions * Handle some functions directly such as calls to external APIs (e.g., transaction cost) * Proxy connections to user's Pod * E2EE messaging between applications * Pod manager this performs: * Initial Pod instantiation * Pod update - new program version * Pod compaction - compact the local blockchain files (possibly this can be an in-Pod process instead) * Reboot Pod to switch networks (possibly this can be an in-Pod process instead) * Messaging * uses whisper protocol to perform end-to-end encrypted messaging between client APPs * server store E2EE messages in a queue for later retrieval (so continuous connections are not necessary) * client must keep a key store and a session store * Notification Relay to forward push notifications * Pod * bitcoind either testnet or mainnet, but *not* both * wallet changes trigger notifier * encrypted image mount for wallet files (key from etcd) * union blockchain mount to share large blockchain data files * (deduplication either on Pod reboot or internal union deduplication) (not sure when this would trigger) --- ## Sequence Diagrams ### Overview ![Overview](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/Overview.png> "Overview") --- ### Registration ![Registration](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/Registration.png> "Registration") **Description** Register account involves the following * Creation of account in DB * Pod instantiation (on boot actions) * start internal process to gather entropy (does this need APP?) * derive xpriv (accumulated entropy) * indicate status: initialised * mount wallets and blockchain * start bitcoind connected to selected network (test/main) * indicate status: running (need to detect bitcoind is in sync) * APP can contact the Pod to request actions :::warning Future Feature - registration with five decks ![RegistrationFiveDecks](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/RegistrationFiveDecks.png> "RegistrationFiveDecks") ::: --- ### CreatePersonalAccount ![CreatePersonalAccount](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/CreatePersonalAccount.png> "CreatePersonalAccount") **Description** * Create initial account to receive funds * derives multisig addresses using `wsh(sortedmulti(2,P,R,G))` * external path: `m/84h/0h/0h/0/*` * internal path: `m/84h/0h/0h/1/*` * see [BIP 84](<https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki>) * relies on saved accountmap to recover xpubs ### NewAddress ![NewAddress](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/NewAddress.png> "NewAddress") **Description** * obtain a new address to receive funds * should not be called unless the previous addresses are already have funds * for privacy an address should only be used once * for compatibility no more than 20 addresses can be outstanding, waiting for funds * bitcoind 0.21 can handle 1000 outstanding addresses, but using this feature would break compatibility --- ### Payment ![Payment](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/Payment.png> "Payment") --- ### ReceiveFunds ![ReceiveFunds](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/ReceiveFunds.png> "ReceiveFunds") --- ### CheckRecoveryIntegrity ![CheckRecoveryIntegrity](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/CheckRecoveryIntegrity.png> "CheckRecoveryIntegrity") **Description** * periodically preform recovery integrity check * Bitmark Deck exists * Contact Deck exists * Platform Deck exists * if sufficient items exist just update backup timestamps * if no redundancy send alert message * _read back recovery key and reshard might be an option_ * if recovery impossible request immediate action * sweep wallet _can existing platform/gordian be used with new recovery?_ ### RecoverAndSweepToNew ![RecoverAndSweepToNew](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/RecoverAndSweepToNew.png> "RecoverAndSweepToNew") **Description** * obtain recovery keypair and recover the old account map from 2 Decks * setup APP/Pod with one keypair each * have Pod iterate over UTXOs * group resulting UTXOs into transactions and ask APP to sign them * Pod countersign, finalise and broadcast :::warning Future Feature - recovery from five decks ![RecoverFiveDecks](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/RecoverFiveDecks.png> "ReecoverFiveDecks") ::: --- ### AutonomyContact :::info Current Simplified Feature ![AutonomyContact](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/AutonomyContact.png> "AutonomyContact") ::: ### AddContact :::warning Future Feature ![AddContact](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/AddContact.png> "AddContact") ::: --- ### BackupToContact ![BackupToContact](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/BackupToContact.png> "BackupToContact") --- ### CreateSharedAccount :::warning Future Feature ![CreateSharedAccount](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/CreateSharedAccount.png> "CreateSharedAccount") ::: --- ## Classes ### SystemClasses ![SystemClasses](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/class/server/SystemClasses.png> "SystemClasses") --- ## still to be updated :::warning Under Construction ::: --- ## Application architecture ### 1. Block diagrams ![ApplicationArchitecture](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/block/application/ApplicationArchitecture.png> "ApplicationArchitecture") ### 2. Account/Keys management (in keys storage) * Use parts of [latest module from Gordian Cosigner](https://github.com/BlockchainCommons/GordianCosigner-Catalyst/tree/master/GordianSigner/Helpers) to generate seed and required keys to ensure compatibility with Gordian System. * Recovery and platform cosigner keypairs are generated independently from Application's process. * Recovery cosigner keypair will be sharded immediately after generated, and its key storage will just store shards. * Platform cosigner keypair keeps its privatekey separated from Application, only receive PSBTs and sign them. * Auth keypair are generated in Application process and used for Signal protocol messaging's identity. * After generated, its 3 shards will be stored along with Recovery cosigner keypair's shards. ### 3. Application database (in file storage) Uses [Core data](https://developer.apple.com/documentation/coredata) to store application business data, includes: * `Contacts`: Contact lists and their vCards * `Activities`: User activities: set up and recover account, deposits, payments,... * `Settings`: User's application settings and preferences. * `Personal vCard`: Users' contact information. The application stores latest snapshot of current database to Cloud storage as files. It also stores an encrypted version of latest snapshot of current database to the Pod as redudant backup. ## Metadata * Application database: * Contacts * Activities (payment notes, tx price, ...) * Personal vCard * Setting * Wallet information: * Account maps -- For recovery verification * Birthdate -- For sweeping * Backup contact: * Identity and alias (contact name). ## Future Work (post-MVA) * Android Java libwally @moskovich * some of the values end up going through strings * make sure that the strings are zeroed out * strings are variable size and need careful consideration * what for string copies * maybe 2 man days of high-level Java expert * Recover * RECOVERY - compromise of one key is assumed, thus use remaining keys to sweep to new Account Map multisig. * recover from loss of application or loss of Pod * recover old funds to new account * retain old wallet files for bitcoind monitoring * _future:_ "crontab" to periodically sweep any new funds to old wallet * _option:_ display remaining two keys as QR for external recovery * Messaging * currently - Bitmark-run central whisper message queue * Signal messaging is currently only single-sig, with all its disadvantages. * messaging uses a key as an identifier. How do we restore or recover or revoke without real decentralized identifier rotation features. * [Key bootstrapping](https://docs.google.com/document/d/1n9zuL5KwlvrEGUz6Vy4gbigE0p9B0VRHyPrTT2h8Gy4/edit) * BTC 2of3 +1(timelock: one year) so the fund is single sig after one year. TRADEOFF: make recovery key as the +1(timelock) * Ed25519 * lots of compatibility problems * different encodings of priv/pub * different privatekey e.d. random, hash() * different signature encodings * [https://gist.github.com/gorazdko/5fbe819b80e780a1894086b5731bb32d](<https://gist.github.com/gorazdko/5fbe819b80e780a1894086b5731bb32d>) * [Ristretto](<https://ristretto.group/ristretto.html>) solves the multisig problem (solves bitmarkd 2 sig transfer). Can use Schnorr with this * Price information where is it from, how to validate * spotbit service * fee estimation service * Transitions to higher-level Bitmark or self-sovereign services. * signal versus onion * minimum necessary understanding of Tor for Pod communication * what problems might Tor cause * Collaborative custodial key services held by Others (including Bitmark) * Open registration * How to choose between multiple vendors of these. * Policy coordinator * (need new name for this other than coordinator as it is confusing) * Helps you choose from different approaches * Multisig transaction coordinator * need more understanding * client support? * Schnorr sig (0.22? Q3 perhaps) (0.21 regtest testnet?) * will this increase message sizes too much * Invoicing and purchase orders * Sweep to new addresses under my own control * not necessarily close the wallet * Fiat work on UX * iOS app's SwiftUI * Fees * fees e.g., one dollar tx with N! dollar fee * whathefee.io fee estimator, but confusing, maybe 3x3 matrix. Better than fast/slow-low/high * fee replacement, could UX have *add more fee button* * Child pays for parent (cpfp) * unconfirmed balance * how to handle balance=0 e.g. unconfirmed balance in *change* ## Appendix: Identification Encoding use did:key but only secp256k1 and get help to add required signature function to iOS wrapper for a secp256k1 C library. This would be the preferred method (as this curve seems to be more secure) **Example:** The secp256k1 compressed forms showing the 33 byte public key with 02/03 prefix: ~~~ % openssl ecparam -name secp256k1 -genkey -out tk.pem ; openssl ec -in tk.pem -conv_form compressed -noout -text read EC key Private-Key: (256 bit) priv: 17:0a:4b:c1:c5:4e:52:86:f0:4f:57:51:6f:03:b4: 61:76:da:38:23:00:41:1d:84:3d:e9:7e:5b:5d:0a: 63:1a pub: 02:5c:d8:12:dd:75:55:28:91:18:1f:a1:68:f3:94: ea:20:fb:c0:47:ee:31:f9:fd:bf:8f:27:e1:a9:e0: 2c:a3:d8 ASN1 OID: secp256k1 % openssl ecparam -name secp256k1 -genkey -out tk.pem ; openssl ec -in tk.pem -conv_form compressed -noout -text read EC key Private-Key: (256 bit) priv: 0b:ae:48:1d:a3:dc:88:50:81:30:26:4a:88:bc:f0: 34:a4:1b:2e:8a:a0:92:01:ad:7c:37:e1:7e:99:20: f7:e7 pub: 03:a2:6e:c8:7a:0b:ee:99:04:5a:3c:01:c3:d1:93: c7:e2:8c:4f:ba:7a:92:0f:23:91:63:1b:46:c2:e5: 29:12:0a ASN1 OID: secp256k1 ~~~ Test cases: https://github.com/BlockchainCommons/musig-cli/blob/master/tests/cli.rs ### PodKeyProvisioning ![PodKeyProvisioning](<https://raw.githubusercontent.com/bitmark-inc/autonomy-docs/main/images/sequence/server/PodKeyProvisioning.png> "PodKeyProvisioning") **Description** * current provisioning for Pod * shows encryption key for NAS storage of wallet files **Reference** - https://hackmd.io/Imu_ROdNQx-JL_W73R4JvQ ## Questions (Probably old and needs refactoring) * Where are the keys? * shard 1: user's device + cloud * shard 1: user's device + cloud * shard 2: contact's device + cloud * shard 3: Bitmark shard server (and its backups) * User xprv on user's device (internal secure store) * Pod xprv in Pod storage (etcd key for at rest encryption of file store) * also note shards and decks (array of shards + *some data*) * 3 BTC keypair only recovery is sharded * identity keypair also sharded * How does recovery vs. compromised work? * Contact shard needs contact to open APP and accept * Bitmark shard uses emailed code * Wallet sweep and reseed not available yet (second device and create new account?) * reconstruction e.g. device failure, but nothing lost * recovery - security risk so reconstruct may be harmful. This gets back two of the 3 keys so a wallet sweep would be required * What are the endpoints? * iOS APP devices locked to some type of platform. subject to *recovery* dependent on the platform supplier * Bitmark cluster initialisation management, Pod provisioning etc. * User services * in app, in Pod, global bitmark provided services * connections to external entities (e.g., price feed) * Pod/app are updated by Bitmark network * cosigner signer services e.g. may require multiple human signers to approve * messaging protocol handles (versus pointers) * What are the communication protocol between endpoints? * HTTPS only for API * E2EE (whisper protocol) over HTTPS for APP→APP messaging * HTTPS for APP→Pod * future Tor with certificate authentication * would like distributed whisper over Tor --- ---

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully