Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
2b1bd175c8
  1. 80
      iguana/iguana_wallet.c
  2. 2
      iguana/tests/addmultisig
  3. 2
      iguana/tests/dumpprivkey
  4. 1
      iguana/tests/dumpprivkeyB
  5. 2
      iguana/tests/importprivkey

80
iguana/iguana_wallet.c

@ -58,6 +58,7 @@ void iguana_walletdelete(struct supernet_info *myinfo,int32_t deleteflag)
cJSON *iguana_walletjson(struct supernet_info *myinfo) cJSON *iguana_walletjson(struct supernet_info *myinfo)
{ {
struct iguana_waccount *wacct,*tmp; struct iguana_waddress *waddr,*tmp2; cJSON *wallet,*account; char scriptstr[4096]; struct iguana_waccount *wacct,*tmp; struct iguana_waddress *waddr,*tmp2; cJSON *wallet,*account; char scriptstr[4096];
wallet = cJSON_CreateObject();
HASH_ITER(hh,myinfo->wallet,wacct,tmp) HASH_ITER(hh,myinfo->wallet,wacct,tmp)
{ {
account = cJSON_CreateObject(); account = cJSON_CreateObject();
@ -66,6 +67,7 @@ cJSON *iguana_walletjson(struct supernet_info *myinfo)
if ( bits256_nonz(waddr->privkey) == 0 && waddr->scriptlen == 0 ) if ( bits256_nonz(waddr->privkey) == 0 && waddr->scriptlen == 0 )
{ {
free_json(account); free_json(account);
free_json(wallet);
printf("found a null privkey in wallet, abort saving\n"); printf("found a null privkey in wallet, abort saving\n");
return(0); return(0);
} }
@ -75,7 +77,6 @@ cJSON *iguana_walletjson(struct supernet_info *myinfo)
jaddstr(account,waddr->coinaddr,scriptstr); jaddstr(account,waddr->coinaddr,scriptstr);
} else jaddbits256(account,waddr->coinaddr,waddr->privkey); } else jaddbits256(account,waddr->coinaddr,waddr->privkey);
} }
wallet = cJSON_CreateObject();
jadd(wallet,wacct->account,account); jadd(wallet,wacct->account,account);
} }
return(wallet); return(wallet);
@ -448,22 +449,37 @@ bits256 iguana_str2priv(struct supernet_info *myinfo,struct iguana_info *coin,ch
return(privkey); return(privkey);
} }
int32_t iguana_pubkeyget(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *pubkey33,char *pkstr) int32_t iguana_pubkeyget(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *pubkey33,char *str)
{
bits256 privkey,pubkey; uint8_t pubkeydata[128]; int32_t len,plen= -1; struct iguana_waccount *wacct; struct iguana_waddress *waddr;
len = (int32_t)strlen(str);
if ( is_hexstr(str,len) == 0 )
{
if ( (waddr= iguana_waddresssearch(myinfo,coin,&wacct,str)) != 0 )
{
if ( (plen= bitcoin_pubkeylen(waddr->pubkey)) > 0 )
memcpy(pubkeydata,waddr->pubkey,plen);
}
}
else
{ {
bits256 privkey,pubkey; decode_hex(pubkeydata,len,str);
decode_hex(pubkey33,(int32_t)strlen(pkstr) >> 1,pkstr); plen = bitcoin_pubkeylen(pubkeydata);
if ( bitcoin_pubkeylen(pubkey33) <= 0 ) }
if ( plen <= 0 )
{ {
privkey = iguana_str2priv(myinfo,coin,pkstr); privkey = iguana_str2priv(myinfo,coin,str);
if ( bits256_nonz(privkey) == 0 ) if ( bits256_nonz(privkey) == 0 )
return(-1); return(-1);
else else
{ {
pubkey = bitcoin_pubkey33(pubkey33,privkey); pubkey = bitcoin_pubkey33(pubkeydata,privkey);
if ( bits256_nonz(pubkey) == 0 ) if ( bits256_nonz(pubkey) == 0 )
return(-1); return(-1);
} }
} }
if ( (plen= bitcoin_pubkeylen(pubkeydata)) > 0 )
memcpy(pubkey33,pubkeydata,plen);
return(0); return(0);
} }
@ -919,16 +935,48 @@ TWOSTRINGS_AND_INT(bitcoinrpc,importprivkey,wif,account,rescan)
STRING_ARG(bitcoinrpc,dumpprivkey,address) STRING_ARG(bitcoinrpc,dumpprivkey,address)
{ {
cJSON *retjson; struct iguana_waddress *waddr; struct iguana_waccount *wacct; cJSON *retjson,*privkeys,*addresses,*pubkeys; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char redeemstr[4096],pubkeystr[256],*wifstr; int32_t i,plen,type; struct vin_info V; bits256 debugtxid;
if ( remoteaddr != 0 ) if ( remoteaddr != 0 )
return(clonestr("{\"error\":\"no remote\"}")); return(clonestr("{\"error\":\"no remote\"}"));
if ( myinfo->expiration == 0 ) if ( myinfo->expiration == 0 )
return(clonestr("{\"error\":\"need to unlock wallet\"}")); return(clonestr("{\"error\":\"need to unlock wallet\"}"));
myinfo->expiration++; myinfo->expiration++;
if ( (waddr= iguana_waddresssearch(myinfo,coin,&wacct,address)) != 0 && waddr->wifstr[0] != 0 ) if ( (waddr= iguana_waddresssearch(myinfo,coin,&wacct,address)) != 0 && (waddr->wifstr[0] != 0 || waddr->scriptlen > 0) )
{ {
retjson = cJSON_CreateObject(); retjson = cJSON_CreateObject();
if ( waddr->wifstr[0] != 0 )
jaddstr(retjson,"result",waddr->wifstr); jaddstr(retjson,"result",waddr->wifstr);
else
{
init_hexbytes_noT(redeemstr,waddr->redeemScript,waddr->scriptlen);
jaddstr(retjson,"redeemScript",redeemstr);
memset(debugtxid.bytes,0,sizeof(debugtxid));
if ( (type= iguana_calcrmd160(coin,0,&V,waddr->redeemScript,waddr->scriptlen, debugtxid,-1,0xffffffff)) >= 0 )
{
privkeys = cJSON_CreateArray();
pubkeys = cJSON_CreateArray();
addresses = cJSON_CreateArray();
for (i=0; i<V.N; i++)
{
if ( V.signers[i].coinaddr[0] != 0 && (waddr= iguana_waddresssearch(myinfo,coin,&wacct,V.signers[i].coinaddr)) != 0 && waddr->wifstr[0] != 0 )
jaddistr(privkeys,waddr->wifstr);
else jaddistr(privkeys,"");
wifstr = "";
if ( (plen= bitcoin_pubkeylen(V.signers[i].pubkey)) > 0 )
{
init_hexbytes_noT(pubkeystr,V.signers[i].pubkey,plen);
jaddistr(pubkeys,pubkeystr);
} else jaddistr(pubkeys,"");
jaddistr(addresses,V.signers[i].coinaddr);
}
jaddstr(retjson,"result",V.coinaddr);
jaddnum(retjson,"M",V.M);
jaddnum(retjson,"N",V.N);
jadd(retjson,"pubkeys",pubkeys);
jadd(retjson,"privkeys",privkeys);
jadd(retjson,"addresses",addresses);
}
}
return(jprint(retjson,1)); return(jprint(retjson,1));
} else return(clonestr("{\"error\":\"no privkey for address\"}")); } else return(clonestr("{\"error\":\"no privkey for address\"}"));
} }
@ -978,6 +1026,8 @@ STRING_ARG(bitcoinrpc,dumpwallet,filename)
{ {
if ( (walletobj= jobj(strobj,"wallet")) != 0 ) if ( (walletobj= jobj(strobj,"wallet")) != 0 )
jadd(retjson,"wallet",jduplicate(walletobj)); jadd(retjson,"wallet",jduplicate(walletobj));
if ( 0 && (walletobj= iguana_walletjson(myinfo)) != 0 )
jadd(retjson,"memory",walletobj);
free_json(strobj); free_json(strobj);
} }
scrubfree(walletstr); scrubfree(walletstr);
@ -1271,7 +1321,7 @@ STRING_AND_INT(bitcoinrpc,getreceivedbyaddress,address,minconf)
INT_ARRAY_STRING(bitcoinrpc,createmultisig,M,pubkeys,ignore) INT_ARRAY_STRING(bitcoinrpc,createmultisig,M,pubkeys,ignore)
{ {
cJSON *retjson,*pkjson; uint8_t script[2048],p2sh_rmd160[20]; char msigaddr[64],*pkstr,scriptstr[sizeof(script)*2+1]; struct vin_info V; int32_t i,len,n = cJSON_GetArraySize(pubkeys); cJSON *retjson,*pkjson,*addresses; uint8_t script[2048],p2sh_rmd160[20]; char pubkeystr[256],msigaddr[64],*pkstr,scriptstr[sizeof(script)*2+1]; struct vin_info V; int32_t i,plen,len,n = cJSON_GetArraySize(pubkeys);
if ( remoteaddr != 0 ) if ( remoteaddr != 0 )
return(clonestr("{\"error\":\"no remote\"}")); return(clonestr("{\"error\":\"no remote\"}"));
if ( n < 0 || n > 16 || M < 0 || M > n ) if ( n < 0 || n > 16 || M < 0 || M > n )
@ -1279,15 +1329,19 @@ INT_ARRAY_STRING(bitcoinrpc,createmultisig,M,pubkeys,ignore)
memset(&V,0,sizeof(V)); memset(&V,0,sizeof(V));
V.M = M, V.N = n; V.M = M, V.N = n;
pkjson = cJSON_CreateArray(); pkjson = cJSON_CreateArray();
addresses = cJSON_CreateArray();
for (i=0; i<n; i++) for (i=0; i<n; i++)
{ {
if ( (pkstr= jstr(jitem(pubkeys,i),0)) != 0 ) if ( (pkstr= jstr(jitem(pubkeys,i),0)) != 0 )
{ {
if ( iguana_pubkeyget(myinfo,coin,V.signers[i].pubkey,pkstr) < 0 ) if ( iguana_pubkeyget(myinfo,coin,V.signers[i].pubkey,pkstr) < 0 )
break; break;
if ( bitcoin_pubkeylen(V.signers[i].pubkey) <= 0 ) if ( (plen= bitcoin_pubkeylen(V.signers[i].pubkey)) <= 0 )
break; break;
jaddistr(pkjson,pkstr); bitcoin_address(V.signers[i].coinaddr,coin->chain->pubtype,V.signers[i].pubkey,plen);
jaddistr(addresses,V.signers[i].coinaddr);
init_hexbytes_noT(pubkeystr,V.signers[i].pubkey,plen);
jaddistr(pkjson,pubkeystr);
} else break; } else break;
} }
retjson = cJSON_CreateObject(); retjson = cJSON_CreateObject();
@ -1302,6 +1356,7 @@ INT_ARRAY_STRING(bitcoinrpc,createmultisig,M,pubkeys,ignore)
jaddnum(retjson,"M",M); jaddnum(retjson,"M",M);
jaddnum(retjson,"N",n); jaddnum(retjson,"N",n);
jadd(retjson,"pubkeys",pkjson); jadd(retjson,"pubkeys",pkjson);
jadd(retjson,"addresses",addresses);
} }
else else
{ {
@ -1321,6 +1376,7 @@ INT_ARRAY_STRING(bitcoinrpc,addmultisigaddress,M,pubkeys,account) //
myinfo->expiration++; myinfo->expiration++;
if ( (retstr= bitcoinrpc_createmultisig(IGUANA_CALLARGS,M,pubkeys,account)) != 0 ) if ( (retstr= bitcoinrpc_createmultisig(IGUANA_CALLARGS,M,pubkeys,account)) != 0 )
{ {
//printf("CREATEMULTISIG.(%s)\n",retstr);
if ( (retjson= cJSON_Parse(retstr)) != 0 ) if ( (retjson= cJSON_Parse(retstr)) != 0 )
{ {
if ( (msigaddr= jstr(retjson,"address")) != 0 ) if ( (msigaddr= jstr(retjson,"address")) != 0 )

2
iguana/tests/addmultisig

@ -1,2 +1,2 @@
curl --url "http://127.0.0.1:7778" --data "{\"method\":\"addmultisig\",\"params\":[2, [\"002629c77b81a4d338a339488aaff796a93aeec8c734b22dee865d0ff58ff64c\", \"d0296ed1364639c696c374730320480301f3194c86231f62f0409cd76467f87c\", \"d045925b3e6f648bca6ed0c65149ee445137f0ab14e88cf60013d88419bcdd60\"], \"msigs\"]}" curl --url "http://127.0.0.1:7778" --data "{\"method\":\"addmultisig\",\"params\":[2, [\"1CHzgAakwGCvGX2BG1duWygDuVE6s7tzZ6\", \"d0296ed1364639c696c374730320480301f3194c86231f62f0409cd76467f87c\", \"d045925b3e6f648bca6ed0c65149ee445137f0ab14e88cf60013d88419bcdd60\"], \"msigs\"]}"

2
iguana/tests/dumpprivkey

@ -1 +1 @@
curl --url "http://127.0.0.1:7778" --data "{\"method\":\"dumpprivkey\",\"params\":[\"R9S7zZzzvgb4CkiBH1i7gnFcwJuL1MYbxN\"]}" curl --url "http://127.0.0.1:7778" --data "{\"method\":\"dumpprivkey\",\"params\":[\"1CHzgAakwGCvGX2BG1duWygDuVE6s7tzZ6\"]}"

1
iguana/tests/dumpprivkeyB

@ -0,0 +1 @@
curl --url "http://127.0.0.1:7778" --data "{\"method\":\"dumpprivkey\",\"params\":[\"3KJ3cZ1czvEt1saDbz4EnTu48MSeq3vd5X\"]}"

2
iguana/tests/importprivkey

@ -1 +1 @@
curl --url "http://127.0.0.1:7778" --data "{\"method\":\"importprivkey\",\"params\":[\"580a86aca8df6ffdc8794cf1fecb36707e89dd1f9ca81d221f529f22ffcca946\"]}" curl --url "http://127.0.0.1:7778" --data "{\"method\":\"importprivkey\",\"params\":[\"b81e824a58cefff953eb53e9743059d001be0f5cfeb7599fbdd6bd18dba6616c\"]}"

Loading…
Cancel
Save