Browse Source

Add OP_SIZE and allow bob to bobspend after aliceclaim

https://gist.github.com/markblundeberg/7a932c98179de2190049f5823907c016
patch-3
jl777 7 years ago
parent
commit
e103ff2139
  1. 4
      iguana/exchanges/LP_bitcoin.c
  2. 32
      iguana/exchanges/LP_swap.c
  3. 69
      iguana/exchanges/LP_transaction.c

4
iguana/exchanges/LP_bitcoin.c

@ -118,6 +118,7 @@ static struct bitcoin_opcode { UT_hash_handle hh; uint8_t opcode,flags,stackitem
#define IGUANA_OP_SWAP 0x7c #define IGUANA_OP_SWAP 0x7c
#define IGUANA_OP_TUCK 0x7d #define IGUANA_OP_TUCK 0x7d
#define IGUANA_OP_SIZE 0x82
#define IGUANA_OP_EQUAL 0x87 #define IGUANA_OP_EQUAL 0x87
#define IGUANA_OP_EQUALVERIFY 0x88 #define IGUANA_OP_EQUALVERIFY 0x88
@ -1911,6 +1912,9 @@ int32_t bitcoin_p2shspend(uint8_t *script,int32_t n,uint8_t rmd160[20])
int32_t bitcoin_secret160verify(uint8_t *script,int32_t n,uint8_t secret160[20]) int32_t bitcoin_secret160verify(uint8_t *script,int32_t n,uint8_t secret160[20])
{ {
script[n++] = IGUANA_OP_SIZE; // add SIZE 16 EQUALVERIFY
script[n++] = 32;
script[n++] = SCRIPT_OP_EQUALVERIFY;
script[n++] = SCRIPT_OP_HASH160; script[n++] = SCRIPT_OP_HASH160;
script[n++] = 0x14; script[n++] = 0x14;
memcpy(&script[n],secret160,0x14); memcpy(&script[n],secret160,0x14);

32
iguana/exchanges/LP_swap.c

@ -34,8 +34,6 @@
e) BEFORE Bob broadcasts deposit, Alice broadcasts BTC denominated fee in cltv so if trade isnt done fee is reclaimed e) BEFORE Bob broadcasts deposit, Alice broadcasts BTC denominated fee in cltv so if trade isnt done fee is reclaimed
*/ */
//#define DISABLE_CHECKSIG // unsolved MITM (evil peer)
/* /*
both fees are standard payments: OP_DUP OP_HASH160 FEE_RMD160 OP_EQUALVERIFY OP_CHECKSIG both fees are standard payments: OP_DUP OP_HASH160 FEE_RMD160 OP_EQUALVERIFY OP_CHECKSIG
@ -43,8 +41,7 @@
Bob deposit: Bob deposit:
OP_IF OP_IF
//<now + INSTANTDEX_LOCKTIME*2> OP_CLTV OP_DROP <alice_pubA0> OP_CHECKSIG <now + INSTANTDEX_LOCKTIME*2> OP_CLTV OP_DROP <alice_pubA0> OP_CHECKSIG
<now + INSTANTDEX_LOCKTIME*2> OP_CLTV OP_DROP OP_HASH160 <hash(alice_privM)> OP_EQUALVERIFY <alice_pubA0> OP_CHECKSIG
OP_ELSE OP_ELSE
OP_HASH160 <hash(bob_privN)> OP_EQUALVERIFY <bob_pubB0> OP_CHECKSIG OP_HASH160 <hash(bob_privN)> OP_EQUALVERIFY <bob_pubB0> OP_CHECKSIG
OP_ENDIF OP_ENDIF
@ -64,6 +61,23 @@
pubN and pubM are the corresponding pubkeys for these chosen privkeys pubN and pubM are the corresponding pubkeys for these chosen privkeys
Alice timeout event is triggered if INSTANTDEX_LOCKTIME elapses from the start of a FSM instance. Bob timeout event is triggered after INSTANTDEX_LOCKTIME*2 Alice timeout event is triggered if INSTANTDEX_LOCKTIME elapses from the start of a FSM instance. Bob timeout event is triggered after INSTANTDEX_LOCKTIME*2
Based on https://gist.github.com/markblundeberg/7a932c98179de2190049f5823907c016 and to enable bob to spend alicepayment when alice does a claim for bob deposit, the scripts are changed to the following:
Bob deposit:
OP_IF
OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 <hash(alice_privM)> OP_EQUALVERIFY <now + INSTANTDEX_LOCKTIME*2> OP_CLTV OP_DROP <alice_pubA0> OP_CHECKSIG
OP_ELSE
OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 <hash(bob_privN)> OP_EQUALVERIFY <bob_pubB0> OP_CHECKSIG
OP_ENDIF
Bob paytx:
OP_IF
<now + INSTANTDEX_LOCKTIME> OP_CLTV OP_DROP <bob_pubB1> OP_CHECKSIG
OP_ELSE
OP_SIZE 32 OP_EQUALVERIFY OP_HASH160 <hash(alice_privM)> OP_EQUALVERIFY <alice_pubA0> OP_CHECKSIG
OP_ENDIF
*/ */
/* /*
@ -980,15 +994,7 @@ bits256 instantdex_derivekeypair(void *ctx,bits256 *newprivp,uint8_t pubkey[33],
bits256 basilisk_revealkey(bits256 privkey,bits256 pubkey) bits256 basilisk_revealkey(bits256 privkey,bits256 pubkey)
{ {
bits256 reveal; return(pubkey);
#ifdef DISABLE_CHECKSIG
vcalc_sha256(0,reveal.bytes,privkey.bytes,sizeof(privkey));
//reveal = revcalc_sha256(privkey);
char str[65],str2[65]; printf("priv.(%s) -> reveal.(%s)\n",bits256_str(str,privkey),bits256_str(str2,reveal));
#else
reveal = pubkey;
#endif
return(reveal);
} }
int32_t instantdex_pubkeyargs(struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte) int32_t instantdex_pubkeyargs(struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte)

69
iguana/exchanges/LP_transaction.c

@ -1761,9 +1761,6 @@ int32_t basilisk_swap_bobredeemscript(int32_t depositflag,int32_t *secretstartp,
memcpy(secret160,secretAm,20); memcpy(secret160,secretAm,20);
memcpy(secret256,secretAm256,32); memcpy(secret256,secretAm256,32);
} }
//for (i=0; i<32; i++)
// printf("%02x",secret256[i]);
//printf(" <- secret256 depositflag.%d nonz.%d\n",depositflag,bits256_nonz(privkey));
if ( bits256_nonz(cltvpub) == 0 || bits256_nonz(destpub) == 0 ) if ( bits256_nonz(cltvpub) == 0 || bits256_nonz(destpub) == 0 )
return(-1); return(-1);
for (i=0; i<20; i++) for (i=0; i<20; i++)
@ -1775,48 +1772,37 @@ int32_t basilisk_swap_bobredeemscript(int32_t depositflag,int32_t *secretstartp,
memcpy(pubkeyB+1,destpub.bytes,sizeof(destpub)); memcpy(pubkeyB+1,destpub.bytes,sizeof(destpub));
redeemscript[n++] = SCRIPT_OP_IF; redeemscript[n++] = SCRIPT_OP_IF;
n = bitcoin_checklocktimeverify(redeemscript,n,locktime); n = bitcoin_checklocktimeverify(redeemscript,n,locktime);
#ifdef DISABLE_CHECKSIG if ( depositflag != 0 )
n = bitcoin_secret256spend(redeemscript,n,cltvpub); {
#else for (i=0; i<20; i++)
printf("%02x",secretAm[i]);
printf(" <- secretAm depositflag.%d nonz.%d\n",depositflag,bits256_nonz(privkey));
n = bitcoin_secret160verify(redeemscript,n,secretAm);
}
n = bitcoin_pubkeyspend(redeemscript,n,pubkeyA); n = bitcoin_pubkeyspend(redeemscript,n,pubkeyA);
#endif
redeemscript[n++] = SCRIPT_OP_ELSE; redeemscript[n++] = SCRIPT_OP_ELSE;
if ( secretstartp != 0 ) if ( secretstartp != 0 )
*secretstartp = n + 2; *secretstartp = n + 2;
if ( 1 ) if ( bits256_nonz(privkey) != 0 )
{
if ( 1 && bits256_nonz(privkey) != 0 )
{
uint8_t bufA[20],bufB[20];
revcalc_rmd160_sha256(bufA,privkey);
calc_rmd160_sha256(bufB,privkey.bytes,sizeof(privkey));
/*if ( memcmp(bufA,secret160,sizeof(bufA)) == 0 )
printf("MATCHES BUFA\n");
else if ( memcmp(bufB,secret160,sizeof(bufB)) == 0 )
printf("MATCHES BUFB\n");
else printf("secret160 matches neither\n");
for (i=0; i<20; i++)
printf("%02x",bufA[i]);
printf(" <- revcalc\n");
for (i=0; i<20; i++)
printf("%02x",bufB[i]);
printf(" <- calc\n");*/
memcpy(secret160,bufB,20);
}
n = bitcoin_secret160verify(redeemscript,n,secret160);
}
else
{ {
redeemscript[n++] = 0xa8;//IGUANA_OP_SHA256; uint8_t bufA[20],bufB[20];
redeemscript[n++] = 0x20; revcalc_rmd160_sha256(bufA,privkey);
memcpy(&redeemscript[n],secret256,0x20), n += 0x20; calc_rmd160_sha256(bufB,privkey.bytes,sizeof(privkey));
redeemscript[n++] = 0x88; //SCRIPT_OP_EQUALVERIFY; /*if ( memcmp(bufA,secret160,sizeof(bufA)) == 0 )
} printf("MATCHES BUFA\n");
#ifdef DISABLE_CHECKSIG else if ( memcmp(bufB,secret160,sizeof(bufB)) == 0 )
n = bitcoin_secret256spend(redeemscript,n,destpub); printf("MATCHES BUFB\n");
#else else printf("secret160 matches neither\n");
for (i=0; i<20; i++)
printf("%02x",bufA[i]);
printf(" <- revcalc\n");
for (i=0; i<20; i++)
printf("%02x",bufB[i]);
printf(" <- calc\n");*/
memcpy(secret160,bufB,20);
}
n = bitcoin_secret160verify(redeemscript,n,secret160);
n = bitcoin_pubkeyspend(redeemscript,n,pubkeyB); n = bitcoin_pubkeyspend(redeemscript,n,pubkeyB);
#endif
redeemscript[n++] = SCRIPT_OP_ENDIF; redeemscript[n++] = SCRIPT_OP_ENDIF;
return(n); return(n);
} }
@ -1841,11 +1827,6 @@ int32_t basilisk_bobscript(uint8_t *rmd160,uint8_t *redeemscript,int32_t *redeem
int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen)
{ {
int32_t i,len = 0; int32_t i,len = 0;
#ifdef DISABLE_CHECKSIG
userdata[len++] = sizeof(signpriv);
for (i=0; i<sizeof(privkey); i++)
userdata[len++] = signpriv.bytes[i];
#endif
if ( bits256_nonz(privkey) != 0 ) if ( bits256_nonz(privkey) != 0 )
{ {
userdata[len++] = sizeof(privkey); userdata[len++] = sizeof(privkey);

Loading…
Cancel
Save