This commit is contained in:
jl777
2019-02-21 19:58:07 -11:00
parent 40bbcfd690
commit ba34a80500
2 changed files with 204 additions and 95 deletions

View File

@@ -124,9 +124,9 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx
//int height = it->first.blockHeight; //int height = it->first.blockHeight;
if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 ) if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 )
{ {
//fprintf(stderr,"would return error %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks);
return eval->Invalid("faucet is only for brand new addresses"); return eval->Invalid("faucet is only for brand new addresses");
} }
fprintf(stderr,"txid %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks);
} }
retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts);
if ( retval != 0 ) if ( retval != 0 )

View File

@@ -88,6 +88,54 @@ extern "C" int secp256k1_musig_pubkey_combine(const secp256k1_context* ctx, secp
#define MUSIG_PREVN 0 // for now, just use vout0 for the musig output #define MUSIG_PREVN 0 // for now, just use vout0 for the musig output
#define MUSIG_TXFEE 10000 #define MUSIG_TXFEE 10000
struct musig_info
{
secp256k1_musig_session musig_session;
secp256k1_pubkey combined_pk;
uint8_t *nonce_commitments; // 32*N_SIGNERS
secp256k1_musig_session_signer_data *signer_data; //[N_SIGNERS];
secp256k1_pubkey *nonce; //[N_SIGNERS];
secp256k1_musig_partial_signature *partial_sig; //[N_SIGNERS];
int32_t myind,num;
uint8_t msg[32],pkhash[32],combpk[33];
} *MUSIG;
struct musig_info *musig_infocreate(int32_t myind,int32_t num)
{
struct musig_info *mp = (struct musig_info *)calloc(1,sizeof(*mp));
mp->myind = myind, mp->num = num;
mp->nonce_commitments = (uint8_t *)calloc(num,32);
mp->signer_data = (uint8_t *)calloc(num,sizeof(*np->signer_data));
mp->nonce = (uint8_t *)calloc(num,sizeof(*np->nonce));
mp->partial_sig = (uint8_t *)calloc(num,sizeof(*np->partial_sig));
return(mp);
}
void musig_infofree(struct musig_info *mp)
{
if ( mp->partial_sig != 0 )
{
random_buf(mp->partial_sig,num*sizeof(*np->partial_sig))
free(mp->partial_sig);
}
if ( mp->nonce != 0 )
{
random_buf(mp->nonce,num*sizeof(*np->nonce))
free(mp->nonce);
}
if ( mp->signer_data != 0 )
{
random_buf(mp->signer_data,num*sizeof(*np->signer_data))
free(mp->signer_data);
}
if ( mp->nonce_commitments != 0 )
{
random_buf(mp->nonce_commitments,num*32)
free(mp->nonce_commitments);
}
free(mp);
}
CScript musig_sendopret(uint8_t funcid,CPubKey pk) CScript musig_sendopret(uint8_t funcid,CPubKey pk)
{ {
CScript opret; uint8_t evalcode = EVAL_MUSIG; CScript opret; uint8_t evalcode = EVAL_MUSIG;
@@ -215,8 +263,23 @@ UniValue musig_combine(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
UniValue musig_session(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_session(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
result.push_back(Pair("result","success")); UniValue result(UniValue::VOBJ); int32_t i,n,myind,num; char *pkstr,*pkhashstr,*msgstr; uint8_t session[32],msg[32],pkhash[32],privkey[32],pub33[33]; CPubKey pk; char str[67];
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 5 )
{
// set the 5 args: myind, num, pub33, pkhash32, msg32
if ( MUSIG != 0 )
musig_infofree(MUSIG), MUSIG = 0;
MUSIG = musig_infocreate(myind,num);
pk = buf2pk(pub33);
if ( secp256k1_ec_pubkey_parse(ctx,&MUSIG->combined_pk,pk.begin(),33) > 0 )
{
memcpy(MUSIG->pkhash,pkhash,sizeof(pkhash));
memcpy(MUSIG->msg,msg,sizeof(msg));
random_buf(session,32);
Myprivkey(privkey);
/** Initializes a signing session for a signer /** Initializes a signing session for a signer
* *
* Returns: 1: session is successfully initialized * Returns: 1: session is successfully initialized
@@ -243,18 +306,32 @@ UniValue musig_session(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
* my_index: index of this signer in the signers array * my_index: index of this signer in the signers array
* seckey: the signer's 32-byte secret key (cannot be NULL) * seckey: the signer's 32-byte secret key (cannot be NULL)
*/ */
//if (!secp256k1_musig_session_initialize(ctx, &musig_session[i], signer_data[i], nonce_commitment[i], session_id32, msg32, &combined_pk, pk_hash, N_SIGNERS, i, seckeys[i])) if ( secp256k1_musig_session_initialize(ctx,&MUSIG->musig_session,MUSIG->signer_data, &MUSIG->nonce_commitment[MUSIG->myind * 32],session,MUSIG->msg,&MUSIG->combined_pk,MUSIG->pkhash,MUSIG->num,MUSIG->myind,privkey) > 0 )
//return 0; {
// randombytes_buf(buf, num); result.push_back(Pair("myind",(int64_t)myind));
result.push_back(Pair("numsigners",(int64_t)num));
//nonce_commitment_ptr[i] = &nonce_commitment[i][0]; for (i=0; i<32; i++)
return(result); sprintf(&str[i<<1],"%02x",MUSIG->nonce_commitment[MUSIG->myind*32 + i]);
str[64] = 0;
result.push_back(Pair("commitment",str));
result.push_back(Pair("result","success"));
return(result)
} else return(cclib_error(result,"couldnt initialize session"));
} else return(cclib_error(result,"couldnt parse combined pubkey"));
} else return(cclib_error(result,"wrong number of params, need 5: myindex, numsigners, combined_pk, pkhash, msg32"));
} }
UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
result.push_back(Pair("result","success")); UniValue result(UniValue::VOBJ); int32_t n;
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 3 )
{
// pkhash, ind, commitment
// if all commitments, emit nonce, else just update MUSIG->
/** Gets the signer's public nonce given a list of all signers' data with commitments /** Gets the signer's public nonce given a list of all signers' data with commitments
* *
* Returns: 1: public nonce is written in nonce * Returns: 1: public nonce is written in nonce
@@ -271,15 +348,25 @@ UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
* number of signers participating in the MuSig. * number of signers participating in the MuSig.
*/ */
// Set nonce commitments in the signer data and get the own public nonce // Set nonce commitments in the signer data and get the own public nonce
//if (!secp256k1_musig_session_get_public_nonce(ctx, &musig_session[i], signer_data[i], &nonce[i], nonce_commitment_ptr, N_SIGNERS)) //if (secp256k1_musig_session_get_public_nonce(ctx, &musig_session[i], signer_data[i], &nonce[i], nonce_commitment_ptr, N_SIGNERS) > 0 )
{
// publish nonce
result.push_back(Pair("result","success"));
}
// return 0; // return 0;
} else return(cclib_error(result,"wrong number of params, need 3: pkhash, ind, commitment"));
return(result);
} }
UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
UniValue result(UniValue::VOBJ); int32_t n;
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 )
{
// pkhash, ind, nonce
// if all nonces, combine nonce, else just update MUSIG->
result.push_back(Pair("result","success")); result.push_back(Pair("result","success"));
/** Checks a signer's public nonce against a commitment to said nonce, and update /** Checks a signer's public nonce against a commitment to said nonce, and update
* data structure if they match * data structure if they match
@@ -315,11 +402,19 @@ UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
*/ */
// after all nonces: if (!secp256k1_musig_session_combine_nonces(ctx, &musig_session[i], signer_data[i], N_SIGNERS, NULL, NULL)) { // after all nonces: if (!secp256k1_musig_session_combine_nonces(ctx, &musig_session[i], signer_data[i], N_SIGNERS, NULL, NULL)) {
return(result); return(result);
} else return(cclib_error(result,"wrong number of params, need 3: pkhash, ind, nonce"));
} }
UniValue musig_partialsign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_partialsign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
UniValue result(UniValue::VOBJ); int32_t n;
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 )
{
// similar to commit/nonce
}
result.push_back(Pair("result","success")); result.push_back(Pair("result","success"));
/** Produces a partial signature /** Produces a partial signature
* *
@@ -349,7 +444,14 @@ UniValue musig_partialsign(uint64_t txfee,struct CCcontract_info *cp,cJSON *para
UniValue musig_sigcombine(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_sigcombine(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
UniValue result(UniValue::VOBJ); int32_t n;
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 )
{
// finally!
}
result.push_back(Pair("result","success")); result.push_back(Pair("result","success"));
/** Checks that an individual partial signature verifies /** Checks that an individual partial signature verifies
* *
@@ -387,7 +489,14 @@ UniValue musig_sigcombine(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
UniValue musig_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue musig_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{ {
UniValue result(UniValue::VOBJ); static secp256k1_context *ctx;
UniValue result(UniValue::VOBJ); int32_t n;
if ( ctx == 0 )
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 )
{
// can code this out of order
}
result.push_back(Pair("result","success")); result.push_back(Pair("result","success"));
/** Verify a Schnorr signature. /** Verify a Schnorr signature.
* *