}
}
+int32_t get_KMDheight()
+{
+ cJSON *retjson; char *retstr; int32_t height;
+ if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 )
+ {
+ height = jint(retjson,"blocks");
+ fprintf(stderr,"KMDheight.%d\n",height);
+ free_json(retjson);
+ }
+ else if ( retstr != 0 )
+ {
+ fprintf(stderr,"get_KMDheight error.(%s)\n",retstr);
+ free(retstr);
+ }
+ return(0);
+}
+
+bits256 get_KMDblockhash(int32_t height)
+{
+ cJSON *retjson; char *retstr,heightstr[32]; bits256 hash;
+ memset(hash.bytes,0,sizeof(hash));
+ if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 )
+ {
+ fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0));
+ free_json(retjson);
+ }
+ else if ( retstr != 0 )
+ {
+ fprintf(stderr,"get_KMDblockhash.(%s)\n",retstr);
+ if ( strlen(retstr) == 64 )
+ decode_hex(hash.bytes,32,retstr);
+ free(retstr);
+ }
+ return(hash);
+}
+
+bits256 get_KMDmerkleroot(bits256 blockhash)
+{
+ cJSON *retjson; char *retstr,str[65]; bits256 merkleroot;
+ memset(hash.bytes,0,sizeof(hash));
+ if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 )
+ {
+ merkleroot = jbits256(retjson,"merkleroot");
+ fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot));
+ free_json(retjson);
+ }
+ else if ( retstr != 0 )
+ {
+ fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr);
+ free(retstr);
+ }
+ return(hash);
+}
+
+int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight)
+{
+ int32_t height = 0; char str[65];
+ if ( prevheight == 0 )
+ height = get_KMDheight();
+ else height = prevheight + 1;
+ if ( height > 0 )
+ {
+ *blockhashp = get_KMDblockhash(height);
+ *merklerootp = get_KMDmerkleroot(*blockhashp);
+ return(height);
+ }
+ return(0);
+}
+
+int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *format)
+{
+ uint32_t i,height; uint64_t price; bits256 blockhash,merkleroot;
+ hexstr[0] = 0;
+ if ( format[0] == 'L' || format[0] == 'l' )
+ {
+ if ( (price= get_btcusd()) != 0 )
+ {
+ for (i=0; i<8; i++)
+ sprintf(&hexstr[i*2],"%02x",(uint8_t)((price >> (i*8)) & 0xff));
+ hexstr[16] = 0;
+ return(16);
+ }
+ }
+ else if ( strcmp(format,"Ihh") == 0 )
+ {
+ if ( (height= get_KMDheader(&blockhash,&merkleroot,prevheight)) > prevheight )
+ {
+ for (i=0; i<4; i++)
+ sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff));
+ for (i=0; i<32; i++)
+ sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[i]);
+ for (i=0; i<32; i++)
+ sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[i]);
+ hexstr[8 + 64*2] = 0;
+ return(height);
+ }
+ }
+ return(0);
+}
+
/*
oraclescreate "BTCUSD" "coindeskpricedata" "L" -> 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3
oraclesregister 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3 1000000 -> 11c54d4ab17293217276396e27d86f714576ff55a3300dac34417047825edf93
*/
-#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3"
-#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92"
-#define ACNAME "ORCL"
+//#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3"
+//#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92"
+//#define ACNAME "ORCL"
int32_t main(int32_t argc,char **argv)
{
- cJSON *clijson,*clijson2,*regjson,*item; int32_t i,j,n; char *retstr,*retstr2,*pkstr,hexstr[64]; uint64_t price;
- printf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd()));
+ cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*retstr,*retstr2,*pkstr,hexstr[4096]; uint64_t price;
+ if ( argc != 5 )
+ {
+ printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd()));
+ return(-1);
+ }
+ acname = argv[1];
+ oraclestr = argv[2];
+ pkstr = argv[3];
+ format = argv[4];
+ if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' )
+ {
+ printf("only formats of L and Ihh are supported now\n");
+ return(-1);
+ }
while ( 1 )
{
retstr = 0;
- if ( (price= get_btcusd()) != 0 && (clijson= get_komodocli(&retstr,ACNAME,"oraclesinfo",ORACLETXID,"","")) != 0 )
+ if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 )
{
if ( (regjson= jarray(&n,clijson,"registered")) != 0 )
{
for (i=0; i<n; i++)
{
item = jitem(regjson,i);
- if ( (pkstr= jstr(item,"publisher")) != 0 && strcmp(pkstr,MYPUBKEY) == 0 )
+ if ( (pkstr= jstr(item,"publisher")) != 0 && strcmp(pkstr,pkstr) == 0 )
{
- for (j=0; j<8; j++)
- sprintf(&hexstr[j*2],"%02x",(uint8_t)((price >> (j*8)) & 0xff));
- hexstr[16] = 0;
- if ( (clijson2= get_komodocli(&retstr2,ACNAME,"oraclesdata",ORACLETXID,hexstr,"")) != 0 )
- {
- //printf("data.(%s)\n",jprint(clijson2,0));
- komodobroadcast(ACNAME,clijson2);
- free_json(clijson2);
- }
- else if ( retstr2 != 0 )
+ if ( (height= get_oracledata(prevheight,hexstr,sizeof(hexstr),"Ihh")) != 0 )
{
- printf("error parsing oraclesdata.(%s)\n",retstr2);
- free(retstr2);
+ if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 )
+ {
+ //printf("data.(%s)\n",jprint(clijson2,0));
+ komodobroadcast(acname,clijson2);
+ free_json(clijson2);
+ prevheight = height;
+ printf("ht.%d <- %s\n",height,hexstr);
+ }
+ else if ( retstr2 != 0 )
+ {
+ printf("error parsing oraclesdata.(%s)\n",retstr2);
+ free(retstr2);
+ }
}
break;
}
printf("got json parse error.(%s)\n",retstr);
free(retstr);
}
- sleep(60);
+ sleep(10);
}
return(0);
}