bitfinexcom / smidgen

MIT License
43 stars 16 forks source link

multisig wallets #2

Closed robertkowalski closed 6 years ago

robertkowalski commented 7 years ago

so how would a common workflow look like?

  1. let's say bjorn and enrico create a bitcoin wallet.
  2. bjorn would create a seed, enrico creates a seed.
  3. bjorn creates a digest from his seed and sends the digest to enrico. the digests are safe to share.
  4. enrico finalizes with his digest and now we have an address.

when they want to send money they take the address first björn uses his private key form his seed, sends the bundle per mail to enrico and then enrico is using his key, finalizing the transaction.

right?

question: i imagine that very tedious to remember for users, especially with more than 3 parties. how about something the user can store something, after the address was created (optional):

example of a raw mapping of the api, (ugly!)


# bjorn
$ smidgen multisig create ABCDF
[info] security-level: 3
[info] digest: sdhfuisdfz7sdfzsdf

# enrico
$ smidgen multisig create GHIJK
[info] security-level: 3
[info] digest: kdfdsfsdifdsnf

# bjorn or enrico:

$ smidgen multisig finalize kdfdsfsdifdsnf sdhfuisdfz7sdfzsdf
[info] address: sdfidsofnisdnfsdnfj

# case 1 sending money - no funds left
# smidgen multisig start-transfer <source-multisig-adress> <target-adress> <seed> <amount>
$ smidgen multisig transfer sdfidsofnisdnfsdnfj kdsfjdsfkjsdfjksdjf ABCDF 99999999
[info] bundle: 234fsdfhidsfhiq

# $ smidgen multisig sign <bundle>
$ smidgen multisig sign 234fsdfhidsfhiq
[info] final bundle: 9ufjw0w0wjf

# case 1 sending money
$ smidgen multisig transfer <sum-of-security-levels> <source-address> <remainder-address> <transfers>  
[info] funds left transfer

whats horrible here is that the users have to remember thing slike their chosen security level. they also have to create a remainder address manually later. i also don't like that the order is unclear.

a slightly better ux(?):

# bjorn
# smidgen multisig create <nickname> <seed-origin> <seed-remainder>
$ smidgen multisig create bjorn BJORNSEED-CUR  BJORNSEED-REMAIN > step1.txt

$ cat step1.txt
{ parties: [ { bjorn: {level: 3, digest-main: "xxx", digest-remainder: "yyy" } ]}

# enrico
$ smidgen multisig finalize enrico ENRICOSEED-CUR ENRICOSEED-REMAIN --file="step1.txt" > multiwallet.txt
# or: cat step1.txt > smidgen multisig finalize  > step2.txt

$ cat multiwallet.txt

{
  parties: [ 
    { bjorn: {level: 3, digest-main: "xxx", digest-remainder: "yyy" }}, 
    { enrico: {level: 3, digest-main: "yzf", digest-remainder: "wdw" }}
  ],
  remainderAdress: "foo",
  address: "bar"
}

# sending money:
$ smidgen multiwallet info multiwallet.txt
Parties to sign in signing order: bjorn, enrico
remainder-address used: foo
address: bar

$ smidgen multiwallet transfer multiwallet.txt ENRICOSEED-CURRENT ENRICOSEED-REMAINDER
error: did you follow the signing order? (first: bjorn, then: enrico ...)

$ smidgen multiwallet transfer multiwallet.txt BJORNSEED-CUR  BJORNSEED-REMAIN > transaction.txt

$ cat transaction.txt
{
  parties: [ 
    { bjorn: {level: 3, digest-main: "xxx", digest-remainder: "yyy" }}, 
    { enrico: {level: 3, digest-main: "yzf", digest-remainder: "wdw" }}
  ],
  remainderAddress: "foo",
  address: "bar",
  bundle: "blupp"
  newAddress: {
    parties: [ 
      { bjorn: {level: 3, digest-main: "hfd", digest-remainder: "zuk" }}, 
      { enrico: {level: 3, digest-main: "tte", digest-remainder: "ouz" }}
    ],
  }
}

$ cat transaction.txt > smidgen multiwallet transfer multiwallet.txt ENRICOSEED-CUR  ENRICOSEED-REMAIN > new-multisig-wallet.txt

$ cat new-multisig-wallet.txt

{
  parties: [ 
     { bjorn: {level: 3, digest-main: "hfd", digest-remainder: "zuk" }}, 
     { enrico: {level: 3, digest-main: "tte", digest-remainder: "ouz" }}
  ],
  remainderAddress: "new-foo",
  address: "new-bar"
}
prdn commented 7 years ago

@robertkowalski I like it (second version using files)

robertkowalski commented 6 years ago

first version merged <3