Auto broadcast rogue rpc tx
This commit is contained in:
@@ -136,6 +136,7 @@ UniValue CClib(struct CCcontract_info *cp,char *method,cJSON *params);
|
||||
UniValue CClib_info(struct CCcontract_info *cp);
|
||||
CBlockIndex *komodo_blockindex(uint256 hash);
|
||||
CBlockIndex *komodo_chainactive(int32_t height);
|
||||
int32_t komodo_blockheight(uint256 hash);
|
||||
|
||||
static const uint256 zeroid;
|
||||
static uint256 ignoretxid;
|
||||
|
||||
@@ -129,8 +129,8 @@
|
||||
|
||||
// cclib newgame 17 \"[3,10]\"
|
||||
// cclib pending 17
|
||||
// cclib gameinfo 17 \"[%220a4ecb345ca3090f4acad63f889c3668e46e245cb00ca4b8b57c4677b1ee95b2%22]\"
|
||||
// cclib register 17 \"[%220a4ecb345ca3090f4acad63f889c3668e46e245cb00ca4b8b57c4677b1ee95b2%22]\"
|
||||
// cclib gameinfo 17 \"[%22d8bc6445bfec15ea761c8e91e26d162f47856dba1fc8c8ec508cac83b95d7433%22]\"
|
||||
// cclib register 17 \"[%22d8bc6445bfec15ea761c8e91e26d162f47856dba1fc8c8ec508cac83b95d7433%22]\"
|
||||
// ./rogue <seed> gui -> creates keystroke files
|
||||
// cclib register 17 \"[%220a4ecb345ca3090f4acad63f889c3668e46e245cb00ca4b8b57c4677b1ee95b2%22,%22eef1d0091a88d85bdac1ede9d31db8504bc466a6695fdf259dac623fce09e0dd%22]\"
|
||||
// cclib keystrokes 17 \"[%220a4ecb345ca3090f4acad63f889c3668e46e245cb00ca4b8b57c4677b1ee95b2%22,%22deadbeef%22]\"
|
||||
@@ -331,12 +331,13 @@ uint64_t rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256
|
||||
return(seed);
|
||||
}
|
||||
|
||||
int32_t rogue_isvalidgame(struct CCcontract_info *cp,CTransaction &tx,int64_t &buyin,int32_t &maxplayers,uint256 txid)
|
||||
int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransaction &tx,int64_t &buyin,int32_t &maxplayers,uint256 txid)
|
||||
{
|
||||
uint256 hashBlock; int32_t i,numvouts; char coinaddr[64]; CPubKey roguepk; uint64_t txfee = 10000;
|
||||
buyin = maxplayers = 0;
|
||||
if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 )
|
||||
{
|
||||
gameheight = komodo_blockheight(hashBlock);
|
||||
if ( IsCClibvout(cp,tx,0,cp->unspendableCCaddr) == txfee && myIsutxo_spentinmempool(ignoretxid,ignorevin,txid,0) == 0 )
|
||||
{
|
||||
if ( rogue_newgameopreturndecode(buyin,maxplayers,tx.vout[numvouts-1].scriptPubKey) == 'G' )
|
||||
@@ -635,7 +636,7 @@ UniValue rogue_newgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
if ( (change= inputsum - required) >= txfee )
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,change,roguepk));
|
||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_newgameopret(buyin,maxplayers));
|
||||
return(rogue_rawtxresult(result,rawtx,0));
|
||||
return(rogue_rawtxresult(result,rawtx,1));
|
||||
}
|
||||
else return(cclib_error(result,"illegal maxplayers"));
|
||||
return(result);
|
||||
@@ -668,7 +669,7 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
// vin3+ -> buyin
|
||||
// vout0 -> keystrokes/completion baton
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
UniValue result(UniValue::VOBJ); char destaddr[64],coinaddr[64]; uint256 gametxid,origplayergame,playertxid,hashBlock; int32_t maxplayers,n,numvouts; int64_t inputsum,buyin,CCchange=0; CPubKey pk,mypk,roguepk; CTransaction tx; std::vector<uint8_t> playerdata; std::string rawtx; bits256 t;
|
||||
UniValue result(UniValue::VOBJ); char destaddr[64],coinaddr[64]; uint256 gametxid,origplayergame,playertxid,hashBlock; int32_t maxplayers,gameheight,n,numvouts; int64_t inputsum,buyin,CCchange=0; CPubKey pk,mypk,roguepk; CTransaction tx; std::vector<uint8_t> playerdata; std::string rawtx; bits256 t;
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
@@ -680,7 +681,7 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
if ( n > 0 )
|
||||
{
|
||||
gametxid = juint256(jitem(params,0));
|
||||
if ( rogue_isvalidgame(cp,tx,buyin,maxplayers,gametxid) == 0 )
|
||||
if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,gametxid) == 0 )
|
||||
{
|
||||
if ( n > 1 )
|
||||
{
|
||||
@@ -702,7 +703,7 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
GetCCaddress1of2(cp,destaddr,roguepk,roguepk);
|
||||
CCaddr1of2set(cp,roguepk,roguepk,cp->CCpriv,destaddr);
|
||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_registeropret(gametxid,playertxid));
|
||||
return(rogue_rawtxresult(result,rawtx,0));
|
||||
return(rogue_rawtxresult(result,rawtx,1));
|
||||
} else return(cclib_error(result,"invalid gametxid"));
|
||||
} else return(cclib_error(result,"no gametxid"));
|
||||
} else return(cclib_error(result,"couldnt reparse params"));
|
||||
@@ -717,7 +718,7 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
// respawn to be prevented by including timestamps
|
||||
int32_t nextheight = komodo_nextheight();
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(),nextheight);
|
||||
UniValue result(UniValue::VOBJ); CPubKey roguepk,mypk; uint256 gametxid,batontxid; int64_t batonvalue,buyin; std::vector<uint8_t> keystrokes,playerdata; int32_t numplayers,regslot,numkeys,batonht,batonvout,n,elapsed,maxplayers; CTransaction tx; CTxOut txout; char *keystrokestr,destaddr[64]; std::string rawtx; bits256 t; uint8_t mypriv[32];
|
||||
UniValue result(UniValue::VOBJ); CPubKey roguepk,mypk; uint256 gametxid,batontxid; int64_t batonvalue,buyin; std::vector<uint8_t> keystrokes,playerdata; int32_t numplayers,regslot,numkeys,batonht,batonvout,n,elapsed,gameheight,maxplayers; CTransaction tx; CTxOut txout; char *keystrokestr,destaddr[64]; std::string rawtx; bits256 t; uint8_t mypriv[32];
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
rogue_univalue(result,"keystrokes",-1,-1);
|
||||
@@ -728,7 +729,7 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,destaddr,roguepk,mypk);
|
||||
if ( rogue_isvalidgame(cp,tx,buyin,maxplayers,gametxid) == 0 )
|
||||
if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,gametxid) == 0 )
|
||||
{
|
||||
if ( rogue_findbaton(cp,0,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,tx,maxplayers,destaddr,numplayers) == 0 )
|
||||
{
|
||||
@@ -761,7 +762,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
// vout0 -> 1% ingame gold
|
||||
// get any playerdata, get all keystrokes, replay game and compare final state
|
||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||
UniValue result(UniValue::VOBJ); std::string rawtx; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,tmp,numplayers,regslot,n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector<uint8_t> playerdata,newdata; uint256 batontxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid;
|
||||
UniValue result(UniValue::VOBJ); std::string rawtx; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,gameheight,tmp,numplayers,regslot,n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector<uint8_t> playerdata,newdata; uint256 batontxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid;
|
||||
if ( txfee == 0 )
|
||||
txfee = 10000;
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
@@ -786,7 +787,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
{
|
||||
gametxid = juint256(jitem(params,0));
|
||||
result.push_back(Pair("gametxid",gametxid.GetHex()));
|
||||
if ( rogue_isvalidgame(cp,gametx,buyin,maxplayers,gametxid) == 0 )
|
||||
if ( rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid) == 0 )
|
||||
{
|
||||
if ( maxplayers == 1 )
|
||||
mult /= 2;
|
||||
@@ -834,7 +835,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
Myprivkey(mypriv);
|
||||
CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr);
|
||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_highlanderopret(funcid,gametxid,mypk,newdata));
|
||||
return(rogue_rawtxresult(result,rawtx,0));
|
||||
return(rogue_rawtxresult(result,rawtx,1));
|
||||
}
|
||||
result.push_back(Pair("result","success"));
|
||||
}
|
||||
@@ -855,7 +856,7 @@ UniValue rogue_highlander(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
|
||||
UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,maxplayers,numvouts; uint256 txid; CTransaction tx; int64_t buyin; bits256 t; char myrogueaddr[64]; CPubKey mypk,roguepk;
|
||||
UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,gameheight,maxplayers,numvouts; uint256 txid; CTransaction tx; int64_t buyin; bits256 t; char myrogueaddr[64]; CPubKey mypk,roguepk;
|
||||
result.push_back(Pair("name","rogue"));
|
||||
result.push_back(Pair("method","gameinfo"));
|
||||
if ( (params= cclib_reparse(&n,params)) != 0 )
|
||||
@@ -864,9 +865,10 @@ UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
txid = juint256(jitem(params,0));
|
||||
result.push_back(Pair("gametxid",txid.GetHex()));
|
||||
if ( rogue_isvalidgame(cp,tx,buyin,maxplayers,txid) == 0 )
|
||||
if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,txid) == 0 )
|
||||
{
|
||||
result.push_back(Pair("result","success"));
|
||||
result.push_back(Pair("gameheight",(int64_t)gameheight));
|
||||
mypk = pubkey2pk(Mypubkey());
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,myrogueaddr,roguepk,mypk);
|
||||
@@ -890,11 +892,12 @@ UniValue rogue_gameinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
|
||||
UniValue rogue_pending(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 txid,hashBlock; CTransaction tx; int32_t maxplayers,vout,numvouts; CPubKey roguepk; char coinaddr[64];
|
||||
UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 txid,hashBlock; CTransaction tx; int32_t maxplayers,gameheight,nextheight,vout,numvouts; CPubKey roguepk; char coinaddr[64];
|
||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
GetCCaddress(cp,coinaddr,roguepk);
|
||||
SetCCunspents(unspentOutputs,coinaddr);
|
||||
nextheight = komodo_nextheight();
|
||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||
{
|
||||
txid = it->first.txhash;
|
||||
@@ -902,7 +905,7 @@ UniValue rogue_pending(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
//char str[65]; fprintf(stderr,"%s check %s/v%d %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN);
|
||||
if ( it->second.satoshis != txfee || vout != 0 ) // reject any that are not highlander markers
|
||||
continue;
|
||||
if ( rogue_isvalidgame(cp,tx,buyin,maxplayers,txid) == 0 )
|
||||
if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,txid) == 0 && gameheight > nextheight-777 )
|
||||
a.push_back(txid.GetHex());
|
||||
}
|
||||
result.push_back(Pair("result","success"));
|
||||
@@ -934,7 +937,7 @@ UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
}
|
||||
result.push_back(Pair("result","success"));
|
||||
rogue_univalue(result,"players",-1,-1);
|
||||
result.push_back(Pair("players",a));
|
||||
result.push_back(Pair("numpending",a.size()));
|
||||
result.push_back(Pair("playerdata",a));
|
||||
result.push_back(Pair("numplayerdata",a.size()));
|
||||
return(result);
|
||||
}
|
||||
|
||||
@@ -1041,6 +1041,17 @@ CBlockIndex *komodo_blockindex(uint256 hash)
|
||||
return(pindex);
|
||||
}
|
||||
|
||||
int32_t komodo_blockheight(uint256 hash)
|
||||
{
|
||||
BlockMap::const_iterator it; CBlockIndex *pindex = 0;
|
||||
if ( (it = mapBlockIndex.find(hash)) != mapBlockIndex.end() )
|
||||
{
|
||||
if ( (pindex= it->second) != 0 )
|
||||
return(pindex->GetHeight());
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash)
|
||||
{
|
||||
int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary,*pindex;
|
||||
|
||||
Reference in New Issue
Block a user