@@ -884,6 +884,7 @@ fi
|
||||
|
||||
AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin])
|
||||
AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin])
|
||||
AM_CONDITIONAL([TARGET_LINUX], [test x$TARGET_OS = xlinux])
|
||||
AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
|
||||
AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
|
||||
AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes])
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package=boost
|
||||
$(package)_version=1_69_0
|
||||
$(package)_download_path=https://dl.bintray.com/boostorg/release/1.69.0/source
|
||||
$(package)_version=1_66_0
|
||||
$(package)_download_path=https://dl.bintray.com/boostorg/release/1.66.0/source
|
||||
$(package)_file_name=$(package)_$($(package)_version).tar.bz2
|
||||
$(package)_sha256_hash=8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406
|
||||
$(package)_sha256_hash=5721818253e6a0989583192f96782c4a98eb6204965316df9f5ad75819225ca9
|
||||
|
||||
define $(package)_set_vars
|
||||
$(package)_config_opts_release=variant=release
|
||||
|
||||
@@ -36,7 +36,8 @@ LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl
|
||||
endif
|
||||
if TARGET_DARWIN
|
||||
LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl
|
||||
else
|
||||
endif
|
||||
if TARGET_LINUX
|
||||
LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl
|
||||
endif
|
||||
|
||||
@@ -578,7 +579,8 @@ komodod_LDADD += libcc.dylib $(LIBSECP256K1)
|
||||
endif
|
||||
if TARGET_WINDOWS
|
||||
komodod_LDADD += libcc.dll $(LIBSECP256K1)
|
||||
else
|
||||
endif
|
||||
if TARGET_LINUX
|
||||
komodod_LDADD += libcc.so $(LIBSECP256K1)
|
||||
endif
|
||||
|
||||
|
||||
@@ -224,5 +224,21 @@
|
||||
"addnode": [
|
||||
"37.187.225.231"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ac_name": "OUR",
|
||||
"ac_reward": "1478310502",
|
||||
"ac_halving": "525600",
|
||||
"ac_cc": "42",
|
||||
"ac_supply": "100000000",
|
||||
"ac_perc": "77700",
|
||||
"ac_staked": "93",
|
||||
"ac_pubkey": "02652a3f3e00b3a1875a918314f0bac838d6dd189a346fa623f5efe9541ac0b98c",
|
||||
"ac_public": "1",
|
||||
"addnode": [
|
||||
"51.255.195.65",
|
||||
"217.182.129.38",
|
||||
"95.216.150.177"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -37,6 +37,7 @@ std::string MYCCLIBNAME = (char *)"rogue";
|
||||
|
||||
#define EVAL_SUDOKU 17
|
||||
#define EVAL_MUSIG 18
|
||||
#define EVAL_DILITHIUM 19
|
||||
std::string MYCCLIBNAME = (char *)"sudoku";
|
||||
#endif
|
||||
|
||||
@@ -79,7 +80,13 @@ CClib_methods[] =
|
||||
{ (char *)"musig", (char *)"partialsig", (char *)"pkhash,ind,partialsig", 3, 3, 'S', EVAL_MUSIG },
|
||||
{ (char *)"musig", (char *)"verify", (char *)"msg sig pubkey", 3, 3, 'V', EVAL_MUSIG },
|
||||
{ (char *)"musig", (char *)"send", (char *)"combined_pk amount", 2, 2, 'x', EVAL_MUSIG },
|
||||
{ (char *)"musig", (char *)"spend", (char *)"sendtxid sig destpubkey", 3, 3, 'y', EVAL_MUSIG },
|
||||
{ (char *)"musig", (char *)"spend", (char *)"sendtxid sig scriptPubKey", 3, 3, 'y', EVAL_MUSIG },
|
||||
{ (char *)"dilithium", (char *)"keypair", (char *)"[hexseed]", 0, 1, 'K', EVAL_DILITHIUM },
|
||||
{ (char *)"dilithium", (char *)"register", (char *)"handle, [hexseed]", 1, 2, 'R', EVAL_DILITHIUM },
|
||||
{ (char *)"dilithium", (char *)"sign", (char *)"msg [hexseed]", 1, 2, 'S', EVAL_DILITHIUM },
|
||||
{ (char *)"dilithium", (char *)"verify", (char *)"pubtxid msg sig", 3, 3, 'V', EVAL_DILITHIUM },
|
||||
{ (char *)"dilithium", (char *)"send", (char *)"handle pubtxid amount", 3, 3, 'x', EVAL_DILITHIUM },
|
||||
{ (char *)"dilithium", (char *)"spend", (char *)"sendtxid scriptPubKey [hexseed]", 2, 3, 'y', EVAL_DILITHIUM },
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -119,6 +126,15 @@ UniValue musig_partialsig(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
UniValue musig_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue musig_send(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue musig_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
|
||||
bool dilithium_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx);
|
||||
UniValue dilithium_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue dilithium_send(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue dilithium_spend(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue dilithium_keypair(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue dilithium_sign(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
UniValue dilithium_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
|
||||
|
||||
#endif
|
||||
|
||||
cJSON *cclib_reparse(int32_t *nump,char *jsonstr) // assumes origparams will be freed by caller
|
||||
@@ -243,6 +259,28 @@ UniValue CClib_method(struct CCcontract_info *cp,char *method,char *jsonstr)
|
||||
return(result);
|
||||
}
|
||||
}
|
||||
else if ( cp->evalcode == EVAL_DILITHIUM )
|
||||
{
|
||||
if ( strcmp(method,"send") == 0 )
|
||||
return(dilithium_send(txfee,cp,params));
|
||||
else if ( strcmp(method,"spend") == 0 )
|
||||
return(dilithium_spend(txfee,cp,params));
|
||||
else if ( strcmp(method,"keypair") == 0 )
|
||||
return(dilithium_keypair(txfee,cp,params));
|
||||
else if ( strcmp(method,"register") == 0 )
|
||||
return(dilithium_register(txfee,cp,params));
|
||||
else if ( strcmp(method,"sign") == 0 )
|
||||
return(dilithium_sign(txfee,cp,params));
|
||||
else if ( strcmp(method,"verify") == 0 )
|
||||
return(dilithium_verify(txfee,cp,params));
|
||||
else
|
||||
{
|
||||
result.push_back(Pair("result","error"));
|
||||
result.push_back(Pair("error","invalid dilithium method"));
|
||||
result.push_back(Pair("method",method));
|
||||
return(result);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
@@ -369,6 +407,8 @@ bool CClib_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const C
|
||||
return(sudoku_validate(cp,height,eval,tx));
|
||||
else if ( cp->evalcode == EVAL_MUSIG )
|
||||
return(musig_validate(cp,height,eval,tx));
|
||||
else if ( cp->evalcode == EVAL_DILITHIUM )
|
||||
return(dilithium_validate(cp,height,eval,tx));
|
||||
else return eval->Invalid("invalid evalcode");
|
||||
#endif
|
||||
}
|
||||
@@ -540,6 +580,15 @@ uint256 juint256(cJSON *obj)
|
||||
return(revuint256(tmp));
|
||||
}
|
||||
|
||||
int32_t cclib_parsehash(uint8_t *hash32,cJSON *item,int32_t len)
|
||||
{
|
||||
char *hexstr;
|
||||
if ( (hexstr= jstr(item,0)) != 0 && is_hexstr(hexstr,0) == len*2 )
|
||||
{
|
||||
decode_hex(hash32,len,hexstr);
|
||||
return(0);
|
||||
} else return(-1);
|
||||
}
|
||||
|
||||
#ifdef BUILD_ROGUE
|
||||
#include "rogue_rpc.cpp"
|
||||
@@ -581,6 +630,7 @@ uint256 juint256(cJSON *obj)
|
||||
#else
|
||||
#include "sudoku.cpp"
|
||||
#include "musig.cpp"
|
||||
#include "../secp256k1/src/modules/musig/example.c"
|
||||
#include "dilithium.c"
|
||||
//#include "../secp256k1/src/modules/musig/example.c"
|
||||
#endif
|
||||
|
||||
|
||||
3265
src/cc/dilithium.c
Normal file
3265
src/cc/dilithium.c
Normal file
File diff suppressed because one or more lines are too long
475
src/cc/dilithium.h
Normal file
475
src/cc/dilithium.h
Normal file
@@ -0,0 +1,475 @@
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
#ifndef CPUCYCLES_H
|
||||
#define CPUCYCLES_H
|
||||
|
||||
#ifdef DBENCH
|
||||
#define DBENCH_START() uint64_t time = cpucycles_start()
|
||||
#define DBENCH_STOP(t) t += cpucycles_stop() - time - timing_overhead
|
||||
#else
|
||||
#define DBENCH_START()
|
||||
#define DBENCH_STOP(t)
|
||||
#endif
|
||||
|
||||
#ifdef USE_RDPMC // Needs echo 2 > /sys/devices/cpu/rdpmc
|
||||
#ifdef SERIALIZE_RDC
|
||||
|
||||
static inline uint64_t cpucycles_start(void) {
|
||||
const uint32_t ecx = (1U << 30) + 1;
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("cpuid; movl %1,%%ecx; rdpmc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=&a" (result) : "r" (ecx) : "rbx", "rcx", "rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline uint64_t cpucycles_stop(void) {
|
||||
const uint32_t ecx = (1U << 30) + 1;
|
||||
uint64_t result, dummy;
|
||||
|
||||
asm volatile("rdpmc; shlq $32,%%rdx; orq %%rdx,%%rax; movq %%rax,%0; cpuid"
|
||||
: "=&r" (result), "=c" (dummy) : "c" (ecx) : "rax", "rbx", "rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline uint64_t cpucycles_start(void) {
|
||||
const uint32_t ecx = (1U << 30) + 1;
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("rdpmc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=a" (result) : "c" (ecx) : "rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline uint64_t cpucycles_stop(void) {
|
||||
const uint32_t ecx = (1U << 30) + 1;
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("rdpmc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=a" (result) : "c" (ecx) : "rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
#else
|
||||
#ifdef SERIALIZE_RDC
|
||||
|
||||
static inline uint64_t cpucycles_start(void) {
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("cpuid; rdtsc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=a" (result) : : "%rbx", "%rcx", "%rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline uint64_t cpucycles_stop(void) {
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("rdtscp; shlq $32,%%rdx; orq %%rdx,%%rax; mov %%rax,%0; cpuid"
|
||||
: "=r" (result) : : "%rax", "%rbx", "%rcx", "%rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline uint64_t cpucycles_start(void) {
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("rdtsc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=a" (result) : : "%rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline uint64_t cpucycles_stop(void) {
|
||||
uint64_t result;
|
||||
|
||||
asm volatile("rdtsc; shlq $32,%%rdx; orq %%rdx,%%rax"
|
||||
: "=a" (result) : : "%rdx");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int64_t cpucycles_overhead(void);
|
||||
|
||||
#endif*/
|
||||
|
||||
#ifndef FIPS202_H
|
||||
#define FIPS202_H
|
||||
|
||||
|
||||
#define SHAKE128_RATE 168
|
||||
#define SHAKE256_RATE 136
|
||||
|
||||
void shake128_absorb(uint64_t *s,
|
||||
const uint8_t *input,
|
||||
int32_t inlen);
|
||||
|
||||
void shake128_squeezeblocks(uint8_t *output,
|
||||
int32_t nblocks,
|
||||
uint64_t *s);
|
||||
|
||||
void shake256_absorb(uint64_t *s,
|
||||
const uint8_t *input,
|
||||
int32_t inlen);
|
||||
|
||||
void shake256_squeezeblocks(uint8_t *output,
|
||||
int32_t nblocks,
|
||||
uint64_t *s);
|
||||
|
||||
void shake128(uint8_t *output,
|
||||
int32_t outlen,
|
||||
const uint8_t *input,
|
||||
int32_t inlen);
|
||||
|
||||
void shake256(uint8_t *output,
|
||||
int32_t outlen,
|
||||
const uint8_t *input,
|
||||
int32_t inlen);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef PARAMS_H
|
||||
#define PARAMS_H
|
||||
|
||||
#ifndef MODE
|
||||
#define MODE 3
|
||||
#endif
|
||||
|
||||
#define SEEDBYTES 32U
|
||||
#define CRHBYTES 48U
|
||||
#define N 256U
|
||||
#define Q 8380417U
|
||||
#define QBITS 23U
|
||||
#define ROOT_OF_UNITY 1753U
|
||||
#define D 14U
|
||||
#define GAMMA1 ((Q - 1U)/16U)
|
||||
#define GAMMA2 (GAMMA1/2U)
|
||||
#define ALPHA (2U*GAMMA2)
|
||||
|
||||
#if MODE == 0
|
||||
#define K 3U
|
||||
#define L 2U
|
||||
#define ETA 7U
|
||||
#define SETABITS 4U
|
||||
#define BETA 375U
|
||||
#define OMEGA 64U
|
||||
|
||||
#elif MODE == 1
|
||||
#define K 4U
|
||||
#define L 3U
|
||||
#define ETA 6U
|
||||
#define SETABITS 4U
|
||||
#define BETA 325U
|
||||
#define OMEGA 80U
|
||||
|
||||
#elif MODE == 2
|
||||
#define K 5U
|
||||
#define L 4U
|
||||
#define ETA 5U
|
||||
#define SETABITS 4U
|
||||
#define BETA 275U
|
||||
#define OMEGA 96U
|
||||
|
||||
#elif MODE == 3
|
||||
#define K 6U
|
||||
#define L 5U
|
||||
#define ETA 3U
|
||||
#define SETABITS 3U
|
||||
#define BETA 175U
|
||||
#define OMEGA 120U
|
||||
|
||||
#endif
|
||||
|
||||
#define POL_SIZE_PACKED ((N*QBITS)/8)
|
||||
#define POLT1_SIZE_PACKED ((N*(QBITS - D))/8)
|
||||
#define POLT0_SIZE_PACKED ((N*D)/8)
|
||||
#define POLETA_SIZE_PACKED ((N*SETABITS)/8)
|
||||
#define POLZ_SIZE_PACKED ((N*(QBITS - 3))/8)
|
||||
#define POLW1_SIZE_PACKED ((N*4)/8)
|
||||
#define POLVECK_SIZE_PACKED (K*POL_SIZE_PACKED)
|
||||
#define POLVECL_SIZE_PACKED (L*POL_SIZE_PACKED)
|
||||
|
||||
#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLT1_SIZE_PACKED)
|
||||
#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES + (L + K)*POLETA_SIZE_PACKED + CRHBYTES + K*POLT0_SIZE_PACKED)
|
||||
#define CRYPTO_BYTES (L*POLZ_SIZE_PACKED + (OMEGA + K) + (N/8 + 8))
|
||||
|
||||
#endif
|
||||
#ifndef POLY_H
|
||||
#define POLY_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
//#include "fips202.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t coeffs[N];
|
||||
} poly __attribute__((aligned(32)));
|
||||
|
||||
void poly_reduce(poly *a);
|
||||
void poly_csubq(poly *a);
|
||||
void poly_freeze(poly *a);
|
||||
|
||||
void poly_add(poly *c, const poly *a, const poly *b);
|
||||
void poly_sub(poly *c, const poly *a, const poly *b);
|
||||
void poly_neg(poly *a);
|
||||
void poly_shiftl(poly *a, uint32_t k);
|
||||
|
||||
void poly_ntt(poly *a);
|
||||
void poly_invntt_montgomery(poly *a);
|
||||
void poly_pointwise_invmontgomery(poly *c, const poly *a, const poly *b);
|
||||
|
||||
void poly_power2round(poly *a1, poly *a0, const poly *a);
|
||||
void poly_decompose(poly *a1, poly *a0, const poly *a);
|
||||
uint32_t poly_make_hint(poly *h, const poly *a, const poly *b);
|
||||
void poly_use_hint(poly *a, const poly *b, const poly *h);
|
||||
|
||||
int poly_chknorm(const poly *a, uint32_t B);
|
||||
void poly_uniform(poly *a, const uint8_t *buf);
|
||||
void poly_uniform_eta(poly *a,
|
||||
const uint8_t seed[SEEDBYTES],
|
||||
uint8_t nonce);
|
||||
void poly_uniform_gamma1m1(poly *a,
|
||||
const uint8_t seed[SEEDBYTES + CRHBYTES],
|
||||
uint16_t nonce);
|
||||
|
||||
void polyeta_pack(uint8_t *r, const poly *a);
|
||||
void polyeta_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyt1_pack(uint8_t *r, const poly *a);
|
||||
void polyt1_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyt0_pack(uint8_t *r, const poly *a);
|
||||
void polyt0_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyz_pack(uint8_t *r, const poly *a);
|
||||
void polyz_unpack(poly *r, const uint8_t *a);
|
||||
|
||||
void polyw1_pack(uint8_t *r, const poly *a);
|
||||
#endif
|
||||
#ifndef POLYVEC_H
|
||||
#define POLYVEC_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
//#include "poly.h"
|
||||
|
||||
/* Vectors of polynomials of length L */
|
||||
typedef struct {
|
||||
poly vec[L];
|
||||
} polyvecl;
|
||||
|
||||
void polyvecl_freeze(polyvecl *v);
|
||||
|
||||
void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v);
|
||||
|
||||
void polyvecl_ntt(polyvecl *v);
|
||||
void polyvecl_pointwise_acc_invmontgomery(poly *w,
|
||||
const polyvecl *u,
|
||||
const polyvecl *v);
|
||||
|
||||
int polyvecl_chknorm(const polyvecl *v, uint32_t B);
|
||||
|
||||
|
||||
|
||||
/* Vectors of polynomials of length K */
|
||||
typedef struct {
|
||||
poly vec[K];
|
||||
} polyveck;
|
||||
|
||||
void polyveck_reduce(polyveck *v);
|
||||
void polyveck_csubq(polyveck *v);
|
||||
void polyveck_freeze(polyveck *v);
|
||||
|
||||
void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v);
|
||||
void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v);
|
||||
void polyveck_shiftl(polyveck *v, uint32_t k);
|
||||
|
||||
void polyveck_ntt(polyveck *v);
|
||||
void polyveck_invntt_montgomery(polyveck *v);
|
||||
|
||||
int polyveck_chknorm(const polyveck *v, uint32_t B);
|
||||
|
||||
void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v);
|
||||
void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v);
|
||||
uint32_t polyveck_make_hint(polyveck *h,
|
||||
const polyveck *u,
|
||||
const polyveck *v);
|
||||
void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NTT_H
|
||||
#define NTT_H
|
||||
|
||||
//#include <stdint.h>
|
||||
//#include "params.h"
|
||||
|
||||
void ntt(uint32_t p[N]);
|
||||
void invntt_frominvmont(uint32_t p[N]);
|
||||
|
||||
#endif
|
||||
#ifndef PACKING_H
|
||||
#define PACKING_H
|
||||
|
||||
//#include "params.h"
|
||||
//#include "polyvec.h"
|
||||
|
||||
void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES],
|
||||
const uint8_t rho[SEEDBYTES], const polyveck *t1);
|
||||
void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES],
|
||||
const uint8_t rho[SEEDBYTES],
|
||||
const uint8_t key[SEEDBYTES],
|
||||
const uint8_t tr[CRHBYTES],
|
||||
const polyvecl *s1,
|
||||
const polyveck *s2,
|
||||
const polyveck *t0);
|
||||
void pack_sig(uint8_t sig[CRYPTO_BYTES],
|
||||
const polyvecl *z, const polyveck *h, const poly *c);
|
||||
|
||||
void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1,
|
||||
const uint8_t pk[CRYPTO_PUBLICKEYBYTES]);
|
||||
void unpack_sk(uint8_t rho[SEEDBYTES],
|
||||
uint8_t key[SEEDBYTES],
|
||||
uint8_t tr[CRHBYTES],
|
||||
polyvecl *s1,
|
||||
polyveck *s2,
|
||||
polyveck *t0,
|
||||
const uint8_t sk[CRYPTO_SECRETKEYBYTES]);
|
||||
int unpack_sig(polyvecl *z, polyveck *h, poly *c,
|
||||
const uint8_t sig[CRYPTO_BYTES]);
|
||||
|
||||
#endif
|
||||
#ifndef REDUCE_H
|
||||
#define REDUCE_H
|
||||
|
||||
//#include <stdint.h>
|
||||
|
||||
#define MONT 4193792U // 2^32 % Q
|
||||
#define QINV 4236238847U // -q^(-1) mod 2^32
|
||||
|
||||
/* a <= Q*2^32 => r < 2*Q */
|
||||
uint32_t montgomery_reduce(uint64_t a);
|
||||
|
||||
/* r < 2*Q */
|
||||
uint32_t reduce32(uint32_t a);
|
||||
|
||||
/* a < 2*Q => r < Q */
|
||||
uint32_t csubq(uint32_t a);
|
||||
|
||||
/* r < Q */
|
||||
uint32_t freeze(uint32_t a);
|
||||
|
||||
#endif
|
||||
#ifndef ROUNDING_H
|
||||
#define ROUNDING_H
|
||||
|
||||
//#include <stdint.h>
|
||||
|
||||
uint32_t power2round(const uint32_t a, uint32_t *a0);
|
||||
uint32_t decompose(uint32_t a, uint32_t *a0);
|
||||
uint32_t make_hint(const uint32_t a, const uint32_t b);
|
||||
uint32_t use_hint(const uint32_t a, const uint32_t hint);
|
||||
|
||||
#endif
|
||||
#ifndef SIGN_H
|
||||
#define SIGN_H
|
||||
|
||||
//#include "params.h"
|
||||
//#include "poly.h"
|
||||
//#include "polyvec.h"
|
||||
|
||||
void expand_mat(polyvecl mat[K], const uint8_t rho[SEEDBYTES]);
|
||||
void challenge(poly *c, const uint8_t mu[CRHBYTES],
|
||||
const polyveck *w1);
|
||||
|
||||
int crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
|
||||
|
||||
int crypto_sign(uint8_t *sm, int32_t *smlen,
|
||||
const uint8_t *msg, int32_t len,
|
||||
const uint8_t *sk);
|
||||
|
||||
int crypto_sign_open(uint8_t *m, int32_t *mlen,
|
||||
const uint8_t *sm, int32_t smlen,
|
||||
const uint8_t *pk);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef API_H
|
||||
#define API_H
|
||||
|
||||
#ifndef MODE
|
||||
#define MODE 3
|
||||
#endif
|
||||
|
||||
#if MODE == 0
|
||||
#if CRYPTO_PUBLICKEYBYTES -896U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -2096U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -1387U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 1
|
||||
#if CRYPTO_PUBLICKEYBYTES -1184U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -2800U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -2044U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 2
|
||||
#if CRYPTO_PUBLICKEYBYTES -1472U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -3504U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -2701U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#elif MODE == 3
|
||||
#if CRYPTO_PUBLICKEYBYTES -1760U
|
||||
CRYPTO_PUBLICKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_SECRETKEYBYTES -3856U
|
||||
CRYPTO_SECRETKEYBYTES size error
|
||||
#endif
|
||||
#if CRYPTO_BYTES -3366U
|
||||
CRYPTO_BYTES size error
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define CRYPTO_ALGNAME "Dilithium"
|
||||
|
||||
int crypto_sign_keypair(uint8_t *pk, uint8_t *sk);
|
||||
|
||||
int crypto_sign(uint8_t *sm, int32_t *smlen,
|
||||
const uint8_t *msg, int32_t len,
|
||||
const uint8_t *sk);
|
||||
|
||||
int crypto_sign_open(uint8_t *m, int32_t *mlen,
|
||||
const uint8_t *sm, int32_t smlen,
|
||||
const uint8_t *pk);
|
||||
|
||||
#endif
|
||||
@@ -1,2 +1,2 @@
|
||||
#!/bin/sh
|
||||
gcc -std=c++11 -I../secp256k1/include -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -c -o ../libcc.so cclib.cpp
|
||||
gcc -O3 -std=c++11 -I../secp256k1/include -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -c -o ../libcc.so cclib.cpp
|
||||
|
||||
162
src/cc/musig.cpp
162
src/cc/musig.cpp
@@ -89,7 +89,7 @@ the "msg" is what needs to be signed to create a valid spend
|
||||
"numsigners": 2,
|
||||
"commitment": "bbea1f2562eca01b9a1393c5dc188bdd44551aebf684f4459930f59dde01f7ae",
|
||||
"result": "success"
|
||||
}
|
||||
}
|
||||
|
||||
on node with pubkey: 0255c46dbce584e3751081b39d7fc054fc807100557e73fc444481618b5706afb4
|
||||
./komodo-cli -ac_name=MUSIG cclib session 18 '[1,2,"03f016c348437c7422eed92d865aa9789614f75327cada463eefc566126b54785b","5cb5a225064ca6ffc1438cb2a6ac2ac65fe2d5055dc7f6c7ebffb9a231f8912b","f7fb85d1412814e3c2f98b990802af6ee33dad368c6ba05c2050e9e5506fcd75"]'
|
||||
@@ -219,11 +219,9 @@ struct musig_info
|
||||
secp256k1_musig_session_signer_data *signer_data; //[N_SIGNERS];
|
||||
secp256k1_pubkey *nonces; //[N_SIGNERS];
|
||||
secp256k1_musig_partial_signature *partial_sig; //[N_SIGNERS];
|
||||
int32_t myind,num;
|
||||
int32_t myind,num,numcommits,numnonces,numpartials;
|
||||
uint8_t msg[32],pkhash[32],combpk[33];
|
||||
};
|
||||
|
||||
std::vector <struct musig_info *> MUSIG;
|
||||
} *MUSIG;
|
||||
|
||||
struct musig_info *musig_infocreate(int32_t myind,int32_t num)
|
||||
{
|
||||
@@ -306,6 +304,17 @@ uint8_t musig_spendopretdecode(CPubKey &pk,std::vector<uint8_t> &musig64,CScript
|
||||
return(0);
|
||||
}
|
||||
|
||||
int32_t musig_parsepubkey(secp256k1_context *ctx,secp256k1_pubkey &spk,cJSON *item)
|
||||
{
|
||||
char *hexstr;
|
||||
if ( (hexstr= jstr(item,0)) != 0 && is_hexstr(hexstr,0) == 66 )
|
||||
{
|
||||
CPubKey pk(ParseHex(hexstr));
|
||||
if ( secp256k1_ec_pubkey_parse(ctx,&spk,pk.begin(),33) > 0 )
|
||||
return(1);
|
||||
} else return(-1);
|
||||
}
|
||||
|
||||
int32_t musig_msghash(uint8_t *msg,uint256 prevhash,int32_t prevn,CTxOut vout,CPubKey pk)
|
||||
{
|
||||
CScript data; uint256 hash; int32_t len = 0;
|
||||
@@ -364,27 +373,6 @@ UniValue musig_calcmsg(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
} else return(cclib_error(result,"couldnt parse params"));
|
||||
}
|
||||
|
||||
int32_t musig_parsepubkey(secp256k1_context *ctx,secp256k1_pubkey &spk,cJSON *item)
|
||||
{
|
||||
char *hexstr;
|
||||
if ( (hexstr= jstr(item,0)) != 0 && is_hexstr(hexstr,0) == 66 )
|
||||
{
|
||||
CPubKey pk(ParseHex(hexstr));
|
||||
if ( secp256k1_ec_pubkey_parse(ctx,&spk,pk.begin(),33) > 0 )
|
||||
return(1);
|
||||
} else return(-1);
|
||||
}
|
||||
|
||||
int32_t musig_parsehash(uint8_t *hash32,cJSON *item,int32_t len)
|
||||
{
|
||||
char *hexstr;
|
||||
if ( (hexstr= jstr(item,0)) != 0 && is_hexstr(hexstr,0) == len*2 )
|
||||
{
|
||||
decode_hex(hash32,len,hexstr);
|
||||
return(0);
|
||||
} else return(-1);
|
||||
}
|
||||
|
||||
UniValue musig_combine(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
static secp256k1_context *ctx;
|
||||
@@ -433,15 +421,14 @@ UniValue musig_session(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
num = juint(jitem(params,1),0);
|
||||
if ( myind < 0 || myind >= num || num <= 0 )
|
||||
return(cclib_error(result,"illegal myindex and numsigners"));
|
||||
//if ( MUSIG[myind] != 0 )
|
||||
// musig_infofree(MUSIG[myind]), MUSIG[myind] = 0;
|
||||
struct musig_info *temp_musig = musig_infocreate(myind,num);
|
||||
MUSIG.push_back(temp_musig);
|
||||
if ( musig_parsepubkey(ctx,MUSIG[myind]->combined_pk,jitem(params,2)) < 0 )
|
||||
if ( MUSIG != 0 )
|
||||
musig_infofree(MUSIG), MUSIG = 0;
|
||||
MUSIG = musig_infocreate(myind,num);
|
||||
if ( musig_parsepubkey(ctx,MUSIG->combined_pk,jitem(params,2)) < 0 )
|
||||
return(cclib_error(result,"error parsing combined_pubkey"));
|
||||
else if ( musig_parsehash(MUSIG[myind]->pkhash,jitem(params,3),32) < 0 )
|
||||
else if ( cclib_parsehash(MUSIG->pkhash,jitem(params,3),32) < 0 )
|
||||
return(cclib_error(result,"error parsing pkhash"));
|
||||
else if ( musig_parsehash(MUSIG[myind]->msg,jitem(params,4),32) < 0 )
|
||||
else if ( cclib_parsehash(MUSIG->msg,jitem(params,4),32) < 0 )
|
||||
return(cclib_error(result,"error parsing msg"));
|
||||
Myprivkey(privkey);
|
||||
GetRandBytes(session,32);
|
||||
@@ -471,14 +458,15 @@ UniValue musig_session(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
* my_index: index of this signer in the signers array
|
||||
* seckey: the signer's 32-byte secret key (cannot be NULL)
|
||||
*/
|
||||
if ( secp256k1_musig_session_initialize(ctx,&MUSIG[myind]->session,MUSIG[myind]->signer_data, &MUSIG[myind]->nonce_commitments[MUSIG[myind]->myind * 32],session,MUSIG[myind]->msg,&MUSIG[myind]->combined_pk,MUSIG[myind]->pkhash,MUSIG[myind]->num,MUSIG[myind]->myind,privkey) > 0 )
|
||||
if ( secp256k1_musig_session_initialize(ctx,&MUSIG->session,MUSIG->signer_data, &MUSIG->nonce_commitments[MUSIG->myind * 32],session,MUSIG->msg,&MUSIG->combined_pk,MUSIG->pkhash,MUSIG->num,MUSIG->myind,privkey) > 0 )
|
||||
{
|
||||
memset(session,0,sizeof(session));
|
||||
result.push_back(Pair("myind",(int64_t)myind));
|
||||
result.push_back(Pair("numsigners",(int64_t)num));
|
||||
for (i=0; i<32; i++)
|
||||
sprintf(&str[i<<1],"%02x",MUSIG[myind]->nonce_commitments[MUSIG[myind]->myind*32 + i]);
|
||||
sprintf(&str[i<<1],"%02x",MUSIG->nonce_commitments[MUSIG->myind*32 + i]);
|
||||
str[64] = 0;
|
||||
MUSIG->numcommits = 1;
|
||||
result.push_back(Pair("commitment",str));
|
||||
result.push_back(Pair("result","success"));
|
||||
return(result);
|
||||
@@ -495,20 +483,18 @@ UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
static secp256k1_context *ctx;
|
||||
size_t clen = CPubKey::PUBLIC_KEY_SIZE;
|
||||
UniValue result(UniValue::VOBJ); int32_t i,n,ind,myind; uint8_t pkhash[32]; CPubKey pk; char str[67];
|
||||
UniValue result(UniValue::VOBJ); int32_t i,n,ind; uint8_t pkhash[32]; 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)) == 4 )
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 3 )
|
||||
{
|
||||
if ( (myind= juint(jitem(params,0),0)) < 0 )
|
||||
return(cclib_error(result,"myind is wrong"));
|
||||
if ( musig_parsehash(pkhash,jitem(params,1),32) < 0 )
|
||||
if ( cclib_parsehash(pkhash,jitem(params,0),32) < 0 )
|
||||
return(cclib_error(result,"error parsing pkhash"));
|
||||
else if ( memcmp(MUSIG[myind]->pkhash,pkhash,32) != 0 )
|
||||
else if ( memcmp(MUSIG->pkhash,pkhash,32) != 0 )
|
||||
return(cclib_error(result,"pkhash doesnt match session pkhash"));
|
||||
else if ( (ind= juint(jitem(params,2),0)) < 0 || ind >= MUSIG[myind]->num )
|
||||
else if ( (ind= juint(jitem(params,1),0)) < 0 || ind >= MUSIG->num )
|
||||
return(cclib_error(result,"illegal ind for session"));
|
||||
else if ( musig_parsehash(&MUSIG[myind]->nonce_commitments[ind*32],jitem(params,3),32) < 0 )
|
||||
else if ( cclib_parsehash(&MUSIG->nonce_commitments[ind*32],jitem(params,2),32) < 0 )
|
||||
return(cclib_error(result,"error parsing commitment"));
|
||||
/** Gets the signer's public nonce given a list of all signers' data with commitments
|
||||
*
|
||||
@@ -525,21 +511,17 @@ UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
* n_commitments: the length of commitments and signers array. Must be the total
|
||||
* number of signers participating in the MuSig.
|
||||
*/
|
||||
if ( ind != MUSIG[myind]->num-1 )
|
||||
{
|
||||
//fprintf(stderr, "ind.%i MUSIG[myind]->num.%i\n", ind, MUSIG[myind]->num);
|
||||
return(cclib_error(result,"need rest of nonce's to continue"));
|
||||
}
|
||||
result.push_back(Pair("added_index",ind));
|
||||
//fprintf(stderr, "COMMIT: number of MUSIG structs.%li using struct.%i addedindex.%i\n",MUSIG.size(),myind,ind);
|
||||
if ( secp256k1_musig_session_get_public_nonce(ctx,&MUSIG[myind]->session,MUSIG[myind]->signer_data,&MUSIG[myind]->nonces[MUSIG[myind]->myind],MUSIG[myind]->commitment_ptrs,MUSIG[myind]->num) > 0 )
|
||||
MUSIG->numcommits++;
|
||||
if ( MUSIG->numcommits >= MUSIG->num && secp256k1_musig_session_get_public_nonce(ctx,&MUSIG->session,MUSIG->signer_data,&MUSIG->nonces[MUSIG->myind],MUSIG->commitment_ptrs,MUSIG->num) > 0 )
|
||||
{
|
||||
if ( secp256k1_ec_pubkey_serialize(ctx,(uint8_t *)pk.begin(),&clen,&MUSIG[myind]->nonces[MUSIG[myind]->myind],SECP256K1_EC_COMPRESSED) > 0 && clen == 33 )
|
||||
if ( secp256k1_ec_pubkey_serialize(ctx,(uint8_t *)pk.begin(),&clen,&MUSIG->nonces[MUSIG->myind],SECP256K1_EC_COMPRESSED) > 0 && clen == 33 )
|
||||
{
|
||||
for (i=0; i<33; i++)
|
||||
sprintf(&str[i<<1],"%02x",((uint8_t *)pk.begin())[i]);
|
||||
str[66] = 0;
|
||||
result.push_back(Pair("myind",MUSIG[myind]->myind));
|
||||
MUSIG->numnonces = 1;
|
||||
result.push_back(Pair("myind",MUSIG->myind));
|
||||
result.push_back(Pair("nonce",str));
|
||||
result.push_back(Pair("result","success"));
|
||||
} else return(cclib_error(result,"error serializing nonce (pubkey)"));
|
||||
@@ -550,29 +532,26 @@ UniValue musig_commit(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
result.push_back(Pair("result","success"));
|
||||
}
|
||||
return(result);
|
||||
} else return(cclib_error(result,"wrong number of params, need 4: myind, pkhash, ind, commitment"));
|
||||
} else return(cclib_error(result,"wrong number of params, need 3: pkhash, ind, commitment"));
|
||||
}
|
||||
|
||||
UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
static secp256k1_context *ctx;
|
||||
UniValue result(UniValue::VOBJ); int32_t i,n,ind,myind; uint8_t pkhash[32],psig[32]; CPubKey pk; char str[67];
|
||||
UniValue result(UniValue::VOBJ); int32_t i,n,ind; uint8_t pkhash[32],psig[32]; 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)) == 4 )
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 3 )
|
||||
{
|
||||
if ( (myind= juint(jitem(params,0),0)) < 0 )
|
||||
return(cclib_error(result,"myind is wrong"));
|
||||
if ( musig_parsehash(pkhash,jitem(params,1),32) < 0 )
|
||||
if ( cclib_parsehash(pkhash,jitem(params,0),32) < 0 )
|
||||
return(cclib_error(result,"error parsing pkhash"));
|
||||
else if ( memcmp(MUSIG[myind]->pkhash,pkhash,32) != 0 )
|
||||
else if ( memcmp(MUSIG->pkhash,pkhash,32) != 0 )
|
||||
return(cclib_error(result,"pkhash doesnt match session pkhash"));
|
||||
else if ( (ind= juint(jitem(params,2),0)) < 0 || ind >= MUSIG[myind]->num )
|
||||
else if ( (ind= juint(jitem(params,1),0)) < 0 || ind >= MUSIG->num )
|
||||
return(cclib_error(result,"illegal ind for session"));
|
||||
else if ( musig_parsepubkey(ctx,MUSIG[myind]->nonces[ind],jitem(params,3)) < 0 )
|
||||
else if ( musig_parsepubkey(ctx,MUSIG->nonces[ind],jitem(params,2)) < 0 )
|
||||
return(cclib_error(result,"error parsing nonce"));
|
||||
result.push_back(Pair("added_index",ind));
|
||||
//fprintf(stderr, "NONCE: number of MUSIG structs.%li using struct.%i addedindex.%i\n",MUSIG.size(),myind,ind);
|
||||
/** Checks a signer's public nonce against a commitment to said nonce, and update
|
||||
* data structure if they match
|
||||
*
|
||||
@@ -584,15 +563,9 @@ UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
* with `musig_session_initialize_verifier`.
|
||||
* In: nonce: signer's alleged public nonce (cannot be NULL)
|
||||
*/
|
||||
if ( ind != MUSIG[myind]->num-1 )
|
||||
for (i=0; i<MUSIG->num; i++)
|
||||
{
|
||||
//fprintf(stderr, "ind.%i MUSIG[myind]->num.%i\n", ind, MUSIG[myind]->num);
|
||||
return(cclib_error(result,"need rest of nonce's to continue"));
|
||||
}
|
||||
for (i=0; i<MUSIG[myind]->num; i++)
|
||||
{
|
||||
//fprintf(stderr, "setting nonce for index.%i\n",i);
|
||||
if ( secp256k1_musig_set_nonce(ctx,&MUSIG[myind]->signer_data[i],&MUSIG[myind]->nonces[i]) == 0 )
|
||||
if ( secp256k1_musig_set_nonce(ctx,&MUSIG->signer_data[i],&MUSIG->nonces[i]) == 0 )
|
||||
return(cclib_error(result,"error setting nonce"));
|
||||
}
|
||||
/** Updates a session with the combined public nonce of all signers. The combined
|
||||
@@ -613,53 +586,48 @@ UniValue musig_nonce(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
* adaptor: point to add to the combined public nonce. If NULL, nothing is
|
||||
* added to the combined nonce.
|
||||
*/
|
||||
if ( secp256k1_musig_session_combine_nonces(ctx,&MUSIG[myind]->session,MUSIG[myind]->signer_data,MUSIG[myind]->num,NULL,NULL) > 0 )
|
||||
MUSIG->numnonces++;
|
||||
if ( MUSIG->numnonces >= MUSIG->num && secp256k1_musig_session_combine_nonces(ctx,&MUSIG->session,MUSIG->signer_data,MUSIG->num,NULL,NULL) > 0 )
|
||||
{
|
||||
if ( secp256k1_musig_partial_sign(ctx,&MUSIG[myind]->session,&MUSIG[myind]->partial_sig[MUSIG[myind]->myind]) > 0 )
|
||||
if ( secp256k1_musig_partial_sign(ctx,&MUSIG->session,&MUSIG->partial_sig[MUSIG->myind]) > 0 )
|
||||
{
|
||||
if ( secp256k1_musig_partial_signature_serialize(ctx,psig,&MUSIG[myind]->partial_sig[MUSIG[myind]->myind]) > 0 )
|
||||
if ( secp256k1_musig_partial_signature_serialize(ctx,psig,&MUSIG->partial_sig[MUSIG->myind]) > 0 )
|
||||
{
|
||||
for (i=0; i<32; i++)
|
||||
sprintf(&str[i<<1],"%02x",psig[i]);
|
||||
str[64] = 0;
|
||||
result.push_back(Pair("myind",MUSIG[myind]->myind));
|
||||
result.push_back(Pair("myind",MUSIG->myind));
|
||||
result.push_back(Pair("partialsig",str));
|
||||
result.push_back(Pair("result","success"));
|
||||
MUSIG->numpartials = 1;
|
||||
return(result);
|
||||
} else return(cclib_error(result,"error serializing partial sig"));
|
||||
} else return(cclib_error(result,"error making partial sig"));
|
||||
} else return(cclib_error(result,"error combining nonces"));
|
||||
} else return(cclib_error(result,"wrong number of params, need 4: myind, pkhash, ind, nonce"));
|
||||
} else return(cclib_error(result,"wrong number of params, need 3: pkhash, ind, nonce"));
|
||||
}
|
||||
|
||||
UniValue musig_partialsig(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
static secp256k1_context *ctx;
|
||||
UniValue result(UniValue::VOBJ); int32_t i,ind,myind,n; uint8_t pkhash[32],psig[32],out64[64]; char str[129]; secp256k1_schnorrsig sig;
|
||||
UniValue result(UniValue::VOBJ); int32_t i,ind,n; uint8_t pkhash[32],psig[32],out64[64]; char str[129]; secp256k1_schnorrsig sig;
|
||||
if ( ctx == 0 )
|
||||
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 4 )
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 3 )
|
||||
{
|
||||
if ( (myind= juint(jitem(params,0),0)) < 0 )
|
||||
return(cclib_error(result,"myind is wrong"));
|
||||
if ( musig_parsehash(pkhash,jitem(params,1),32) < 0 )
|
||||
if ( cclib_parsehash(pkhash,jitem(params,0),32) < 0 )
|
||||
return(cclib_error(result,"error parsing pkhash"));
|
||||
else if ( memcmp(MUSIG[myind]->pkhash,pkhash,32) != 0 )
|
||||
else if ( memcmp(MUSIG->pkhash,pkhash,32) != 0 )
|
||||
return(cclib_error(result,"pkhash doesnt match session pkhash"));
|
||||
else if ( (ind= juint(jitem(params,2),0)) < 0 || ind >= MUSIG[myind]->num )
|
||||
else if ( (ind= juint(jitem(params,1),0)) < 0 || ind >= MUSIG->num )
|
||||
return(cclib_error(result,"illegal ind for session"));
|
||||
else if ( musig_parsehash(psig,jitem(params,3),32) < 0 )
|
||||
else if ( cclib_parsehash(psig,jitem(params,2),32) < 0 )
|
||||
return(cclib_error(result,"error parsing psig"));
|
||||
else if ( secp256k1_musig_partial_signature_parse(ctx,&MUSIG[myind]->partial_sig[ind],psig) == 0 )
|
||||
else if ( secp256k1_musig_partial_signature_parse(ctx,&MUSIG->partial_sig[ind],psig) == 0 )
|
||||
return(cclib_error(result,"error parsing partialsig"));
|
||||
result.push_back(Pair("added_index",ind));
|
||||
//fprintf(stderr, "PARTIALSIG: number of MUSIG structs.%li using struct.%i addedindex.%i\n",MUSIG.size(),myind,ind);
|
||||
if ( ind != MUSIG[myind]->num-1 )
|
||||
{
|
||||
//fprintf(stderr, "ind.%i MUSIG[myind]->num.%i\n", ind, MUSIG[myind]->num);
|
||||
return(cclib_error(result,"need rest of nonce's to continue"));
|
||||
}
|
||||
if ( secp256k1_musig_partial_sig_combine(ctx,&MUSIG[myind]->session,&sig,MUSIG[myind]->partial_sig,MUSIG[myind]->num) > 0 )
|
||||
MUSIG->numpartials++;
|
||||
if ( MUSIG->numpartials >= MUSIG->num && secp256k1_musig_partial_sig_combine(ctx,&MUSIG->session,&sig,MUSIG->partial_sig,MUSIG->num) > 0 )
|
||||
{
|
||||
if ( secp256k1_schnorrsig_serialize(ctx,out64,&sig) > 0 )
|
||||
{
|
||||
@@ -672,7 +640,7 @@ UniValue musig_partialsig(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( secp256k1_musig_partial_signature_serialize(ctx,psig,&MUSIG[myind]->partial_sig[MUSIG[myind]->myind]) > 0 )
|
||||
if ( secp256k1_musig_partial_signature_serialize(ctx,psig,&MUSIG->partial_sig[MUSIG->myind]) > 0 )
|
||||
{
|
||||
result.push_back(Pair("myind",ind));
|
||||
for (i=0; i<32; i++)
|
||||
@@ -684,24 +652,24 @@ UniValue musig_partialsig(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
} else return(cclib_error(result,"error generating my partialsig"));
|
||||
}
|
||||
return(result);
|
||||
} else return(cclib_error(result,"wrong number of params, need 4: myind, pkhash, ind, partialsig"));
|
||||
} else return(cclib_error(result,"wrong number of params, need 3: pkhash, ind, partialsig"));
|
||||
}
|
||||
|
||||
int testmain(void);
|
||||
//int testmain(void);
|
||||
UniValue musig_verify(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
{
|
||||
static secp256k1_context *ctx;
|
||||
UniValue result(UniValue::VOBJ); int32_t i,n; uint8_t msg[32],musig64[64]; secp256k1_pubkey combined_pk; secp256k1_schnorrsig musig; char str[129];
|
||||
testmain();
|
||||
//testmain();
|
||||
if ( ctx == 0 )
|
||||
ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) == 3 )
|
||||
{
|
||||
if ( musig_parsehash(msg,jitem(params,0),32) < 0 )
|
||||
if ( cclib_parsehash(msg,jitem(params,0),32) < 0 )
|
||||
return(cclib_error(result,"error parsing pkhash"));
|
||||
else if ( musig_parsepubkey(ctx,combined_pk,jitem(params,1)) < 0 )
|
||||
return(cclib_error(result,"error parsing combined_pk"));
|
||||
else if ( musig_parsehash(musig64,jitem(params,2),64) < 0 )
|
||||
else if ( cclib_parsehash(musig64,jitem(params,2),64) < 0 )
|
||||
return(cclib_error(result,"error parsing musig64"));
|
||||
for (i=0; i<32; i++)
|
||||
sprintf(&str[i*2],"%02x",msg[i]);
|
||||
|
||||
@@ -587,9 +587,9 @@ char *curl_post(CURL **cHandlep,char *url,char *userpass,char *postfields,char *
|
||||
return(chunk.memory);
|
||||
}
|
||||
|
||||
uint16_t _komodo_userpass(char *username, char *password, char *ipaddress, FILE *fp)
|
||||
uint16_t _komodo_userpass(char *username, char *password, FILE *fp)
|
||||
{
|
||||
char *rpcuser,*rpcpassword,*str,line[8192]; uint16_t port = 0;
|
||||
char *rpcuser,*rpcpassword,*str,*ipaddress,line[8192]; uint16_t port = 0;
|
||||
rpcuser = rpcpassword = 0;
|
||||
username[0] = password[0] = 0;
|
||||
while ( fgets(line,sizeof(line),fp) != 0 )
|
||||
@@ -609,6 +609,7 @@ uint16_t _komodo_userpass(char *username, char *password, char *ipaddress, FILE
|
||||
else if ( (str= strstr(line,(char *)"ipaddress")) != 0 )
|
||||
{
|
||||
ipaddress = parse_conf_line(str,(char *)"ipaddress");
|
||||
strcpy(IPADDRESS,ipaddress);
|
||||
}
|
||||
}
|
||||
if ( rpcuser != 0 && rpcpassword != 0 )
|
||||
@@ -616,7 +617,7 @@ uint16_t _komodo_userpass(char *username, char *password, char *ipaddress, FILE
|
||||
strcpy(username,rpcuser);
|
||||
strcpy(password,rpcpassword);
|
||||
}
|
||||
//printf("rpcuser.(%s) rpcpassword.(%s) KMDUSERPASS.(%s) %u\n",rpcuser,rpcpassword,KMDUSERPASS,port);
|
||||
//printf("rpcuser.(%s) rpcpassword.(%s) %u ipaddress.%s\n",rpcuser,rpcpassword,port,ipaddress);
|
||||
if ( rpcuser != 0 )
|
||||
free(rpcuser);
|
||||
if ( rpcpassword != 0 )
|
||||
@@ -661,7 +662,7 @@ uint16_t _komodo_userpass(char *username, char *password, char *ipaddress, FILE
|
||||
//printf("test.(%s) -> [%s] statename.(%s) %s\n",test,ASSETCHAINS_SYMBOL,symbol,fname);
|
||||
}*/
|
||||
|
||||
uint16_t komodo_userpass(char *userpass,char *symbol,char *ipaddress)
|
||||
uint16_t komodo_userpass(char *userpass,char *symbol)
|
||||
{
|
||||
FILE *fp; uint16_t port = 0; char fname[512],username[512],password[512],confname[KOMODO_ASSETCHAIN_MAXLEN];
|
||||
userpass[0] = 0;
|
||||
@@ -677,7 +678,7 @@ uint16_t komodo_userpass(char *userpass,char *symbol,char *ipaddress)
|
||||
//komodo_statefname(fname,symbol,confname);
|
||||
if ( (fp= fopen(confname,"rb")) != 0 )
|
||||
{
|
||||
port = _komodo_userpass(username,password,ipaddress,fp);
|
||||
port = _komodo_userpass(username,password,fp);
|
||||
sprintf(userpass,"%s:%s",username,password);
|
||||
if ( strcmp(symbol,ASSETCHAINS_SYMBOL) == 0 )
|
||||
strcpy(USERPASS,userpass);
|
||||
@@ -723,12 +724,21 @@ void rogue_progress(struct rogue_state *rs,uint64_t seed,char *keystrokes,int32_
|
||||
}
|
||||
else
|
||||
{
|
||||
static FILE *fp;
|
||||
if ( fp == 0 )
|
||||
fp = fopen("keystrokes.log","a");
|
||||
sprintf(params,"[\"keystrokes\",\"17\",\"[%%22%s%%22,%%22%s%%22]\"]",Gametxidstr,hexstr);
|
||||
if ( (retstr= komodo_issuemethod(USERPASS,"cclib",params,ROGUE_PORT)) != 0 )
|
||||
{
|
||||
//fprintf(stderr,"KEYSTROKES.(%s)\n",retstr);
|
||||
if ( fp != 0 )
|
||||
{
|
||||
fprintf(fp,"%s\n",params);
|
||||
fprintf(fp,"%s\n",retstr);
|
||||
fflush(fp);
|
||||
}
|
||||
free(retstr);
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -801,10 +811,10 @@ int main(int argc, char **argv, char **envp)
|
||||
ASSETCHAINS_SYMBOL[j++] = toupper(c);
|
||||
}
|
||||
ASSETCHAINS_SYMBOL[j++] = 0;
|
||||
ROGUE_PORT = komodo_userpass(userpass,ASSETCHAINS_SYMBOL,IPADDRESS);
|
||||
ROGUE_PORT = komodo_userpass(userpass,ASSETCHAINS_SYMBOL);
|
||||
if ( IPADDRESS[0] == 0 )
|
||||
strcpy(IPADDRESS,"127.0.0.1");
|
||||
printf("ASSETCHAINS_SYMBOL.(%s) port.%u (%s)\n",ASSETCHAINS_SYMBOL,ROGUE_PORT,USERPASS); sleep(1);
|
||||
printf("ASSETCHAINS_SYMBOL.(%s) port.%u (%s) IPADDRESS.%s \n",ASSETCHAINS_SYMBOL,ROGUE_PORT,USERPASS,IPADDRESS); sleep(1);
|
||||
if ( argc == 2 && (fp=fopen(argv[1],"rb")) == 0 )
|
||||
{
|
||||
seed = atol(argv[1]);
|
||||
|
||||
@@ -560,13 +560,15 @@ playit(struct rogue_state *rs)
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( rs->needflush != 0 && rs->num > 8000 )
|
||||
if ( rs->needflush != 0 && rs->num > 1000 )
|
||||
{
|
||||
if ( flushkeystrokes(rs) == 0 )
|
||||
rs->needflush = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( rs->guiflag != 0 )
|
||||
flushkeystrokes(rs);
|
||||
endit(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1432,7 +1432,7 @@ rs_write_object(struct rogue_state *rs,FILE *savef, THING *o)
|
||||
if ( o->_o._o_packch != 0 )
|
||||
{
|
||||
item = &rs->P.roguepack[rs->P.packsize];
|
||||
if ( 0 && pstats.s_hpt <= 0 )
|
||||
if ( 1 && pstats.s_hpt <= 0 )
|
||||
{
|
||||
//fprintf(stderr,"KILLED\n");
|
||||
rs->P.gold = -1;
|
||||
|
||||
@@ -839,6 +839,8 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
*numkeysp = 0;
|
||||
seed = 0;
|
||||
num = numkeys = 0;
|
||||
playertxid = zeroid;
|
||||
if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid,0)) == 0 )
|
||||
{
|
||||
if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,rogueaddr,numplayers,symbol,pname) == 0 )
|
||||
@@ -852,7 +854,7 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto
|
||||
for (i=0; i<playerdata.size(); i++)
|
||||
((uint8_t *)&P)[i] = playerdata[i];
|
||||
}
|
||||
if ( keystrokes != 0 )
|
||||
if ( keystrokes != 0 && numkeys != 0 )
|
||||
{
|
||||
if ( makefiles != 0 )
|
||||
{
|
||||
@@ -880,16 +882,34 @@ char *rogue_extractgame(int32_t makefiles,char *str,int32_t *numkeysp,std::vecto
|
||||
}
|
||||
if ( endP.gold <= 0 || endP.hitpoints <= 0 || (endP.strength&0xffff) <= 0 || endP.level <= 0 || endP.experience <= 0 || endP.dungeonlevel <= 0 )
|
||||
{
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
//fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
newdata.resize(0);
|
||||
//P.gold = (P.gold * 8) / 10;
|
||||
if ( keystrokes != 0 )
|
||||
{
|
||||
free(keystrokes);
|
||||
keystrokes = 0;
|
||||
*numkeysp = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(str,"extracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d\n",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel);
|
||||
fprintf(stderr,"%s\n",str);
|
||||
*numkeysp = numkeys;
|
||||
return(keystrokes);
|
||||
}
|
||||
sprintf(str,"extracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d\n",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel);
|
||||
fprintf(stderr,"%s\n",str);
|
||||
} else num = 0;
|
||||
} else fprintf(stderr,"extractgame: couldnt find baton\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"extractgame: couldnt find baton keystrokes.%p\n",keystrokes);
|
||||
if ( keystrokes != 0 )
|
||||
free(keystrokes), keystrokes = 0;
|
||||
}
|
||||
} else fprintf(stderr,"extractgame: invalid game\n");
|
||||
*numkeysp = numkeys;
|
||||
return(keystrokes);
|
||||
//fprintf(stderr,"extract %s\n",gametxid.GetHex().c_str());
|
||||
return(0);
|
||||
}
|
||||
|
||||
UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
@@ -936,6 +956,56 @@ UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
return(result);
|
||||
}
|
||||
|
||||
int32_t rogue_playerdata_validate(uint256 &playertxid,struct CCcontract_info *cp,std::vector<uint8_t> playerdata,uint256 gametxid,CPubKey pk)
|
||||
{
|
||||
static uint32_t good,bad; static uint256 prevgame;
|
||||
char str[512],*keystrokes,rogueaddr[64],str2[67]; int32_t i,numkeys; std::vector<uint8_t> newdata; uint64_t seed; CPubKey roguepk; struct rogue_player P;
|
||||
if ( gametxid == prevgame )
|
||||
return(0);
|
||||
prevgame = gametxid;
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,rogueaddr,roguepk,pk);
|
||||
//fprintf(stderr,"call extractgame\n");
|
||||
if ( (keystrokes= rogue_extractgame(0,str,&numkeys,newdata,seed,playertxid,cp,gametxid,rogueaddr)) != 0 )
|
||||
{
|
||||
//fprintf(stderr,"numkeys.%d rogue_extractgame %s\n",numkeys,gametxid.GetHex().c_str());
|
||||
free(keystrokes);
|
||||
//fprintf(stderr,"extracted.(%s)\n",str);
|
||||
if ( newdata == playerdata )
|
||||
{
|
||||
good++;
|
||||
fprintf(stderr,"%s good.%d bad.%d\n",gametxid.GetHex().c_str(),good,bad);
|
||||
return(0);
|
||||
}
|
||||
newdata[10] = newdata[11] = playerdata[10] = playerdata[11] = 0;
|
||||
if ( newdata == playerdata )
|
||||
{
|
||||
good++;
|
||||
fprintf(stderr,"%s matched after clearing maxstrength good.%d bad.%d\n",gametxid.GetHex().c_str(),good,bad);
|
||||
return(0);
|
||||
}
|
||||
for (i=0; i<playerdata.size(); i++)
|
||||
((uint8_t *)&P)[i] = playerdata[i];
|
||||
if ( P.gold <= 0 || P.hitpoints <= 0 || (P.strength&0xffff) <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0 )
|
||||
{
|
||||
//P.gold = (P.gold * 8) / 10;
|
||||
//for (i=0; i<playerdata.size(); i++)
|
||||
// playerdata[i] = ((uint8_t *)&P)[i];
|
||||
if ( newdata.size() == 0 )
|
||||
{
|
||||
good++;
|
||||
return(0);
|
||||
}
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata, good.%d bad.%d\n",good,bad);
|
||||
}
|
||||
bad++;
|
||||
fprintf(stderr,"%s playerdata: gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d\n",gametxid.GetHex().c_str(),P.gold,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel);
|
||||
fprintf(stderr,"newdata[%d] != playerdata[%d], numkeys.%d %s pub.%s playertxid.%s good.%d bad.%d\n",(int32_t)newdata.size(),(int32_t)playerdata.size(),numkeys,rogueaddr,pubkey33_str(str2,(uint8_t *)&pk),playertxid.GetHex().c_str(),good,bad);
|
||||
}
|
||||
//fprintf(stderr,"no keys rogue_extractgame %s\n",gametxid.GetHex().c_str());
|
||||
return(-1);
|
||||
}
|
||||
|
||||
UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *params,char *method)
|
||||
{
|
||||
//vin0 -> highlander vout from creategame TCBOO
|
||||
@@ -950,7 +1020,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,symbol,pname; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,err,gameheight,tmp,numplayers,regslot,n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector<uint8_t> playerdata,newdata,nodata; uint256 batontxid,playertxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid;
|
||||
UniValue result(UniValue::VOBJ); std::string rawtx,symbol,pname; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,err,gameheight,tmp,numplayers,regslot,n,num,dungeonlevel,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector<uint8_t> playerdata,newdata,nodata; uint256 batontxid,playertxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid;
|
||||
struct CCcontract_info *cpTokens, tokensC;
|
||||
|
||||
if ( txfee == 0 )
|
||||
@@ -964,12 +1034,12 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
if ( strcmp(method,"bailout") == 0 )
|
||||
{
|
||||
funcid = 'Q';
|
||||
mult = 100000;
|
||||
mult = 10; //100000;
|
||||
}
|
||||
else
|
||||
{
|
||||
funcid = 'H';
|
||||
mult = 200000;
|
||||
mult = 20; //200000;
|
||||
}
|
||||
if ( params != 0 && (n= cJSON_GetArraySize(params)) > 0 )
|
||||
{
|
||||
@@ -994,7 +1064,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
{
|
||||
num = rogue_replay2(player,seed,keystrokes,numkeys,playerdata.size()==0?0:&P,0);
|
||||
if ( keystrokes != 0 )
|
||||
free(keystrokes);
|
||||
free(keystrokes), keystrokes = 0;
|
||||
} else num = 0;
|
||||
mtx.vin.push_back(CTxIn(batontxid,batonvout,CScript()));
|
||||
mtx.vin.push_back(CTxIn(gametxid,1+maxplayers+regslot,CScript()));
|
||||
@@ -1008,22 +1078,26 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
newdata[i] = player[i];
|
||||
((uint8_t *)&P)[i] = player[i];
|
||||
}
|
||||
if ( 0 && (P.gold <= 0 || P.hitpoints <= 0 || (P.strength&0xffff) <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0) )
|
||||
if ( (P.gold <= 0 || P.hitpoints <= 0 || (P.strength&0xffff) <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0) )
|
||||
{
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
//fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
newdata.resize(0);
|
||||
//P.gold = (P.gold * 8) / 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( maxplayers == 1 )
|
||||
mult /= 2;
|
||||
//if ( maxplayers == 1 )
|
||||
// mult /= 2;
|
||||
cpTokens = CCinit(&tokensC, EVAL_TOKENS);
|
||||
mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, txfee, GetUnspendable(cpTokens,NULL))); // marker to token cc addr, burnable and validated
|
||||
mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode,1,mypk));
|
||||
fprintf(stderr,"\nextracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d n.%d amulet.%d\n",P.gold,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel,n,P.amulet);
|
||||
if ( P.amulet != 0 )
|
||||
mult *= 5;
|
||||
cashout = (uint64_t)P.gold * mult;
|
||||
dungeonlevel = P.dungeonlevel;
|
||||
if ( P.amulet != 0 && dungeonlevel < 21 )
|
||||
dungeonlevel = 21;
|
||||
cashout = (uint64_t)P.gold * P.gold * mult * dungeonlevel;
|
||||
fprintf(stderr,"\nextracted $$$gold.%d -> %.8f ROGUE hp.%d strength.%d/%d level.%d exp.%d dl.%d n.%d amulet.%d\n",P.gold,(double)cashout/COIN,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel,n,P.amulet);
|
||||
if ( funcid == 'H' && maxplayers > 1 )
|
||||
{
|
||||
if ( (numplayers != maxplayers || (numplayers - rogue_playersalive(tmp,gametxid,maxplayers)) > 1) && P.amulet == 0 )
|
||||
@@ -1039,7 +1113,6 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
}
|
||||
}
|
||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange + (batonvalue-3*txfee),roguepk));
|
||||
|
||||
Myprivkey(mypriv);
|
||||
CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr);
|
||||
CScript opret;
|
||||
@@ -1233,46 +1306,6 @@ UniValue rogue_setname(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
||||
return(result);
|
||||
}
|
||||
|
||||
int32_t rogue_playerdata_validate(uint256 &playertxid,struct CCcontract_info *cp,std::vector<uint8_t> playerdata,uint256 gametxid,CPubKey pk)
|
||||
{
|
||||
static uint32_t good,bad; static uint256 prevgame;
|
||||
char str[512],*keystrokes,rogueaddr[64],str2[67]; int32_t i,numkeys; std::vector<uint8_t> newdata; uint64_t seed; CPubKey roguepk; struct rogue_player P;
|
||||
if ( gametxid == prevgame )
|
||||
return(0);
|
||||
prevgame = gametxid;
|
||||
roguepk = GetUnspendable(cp,0);
|
||||
GetCCaddress1of2(cp,rogueaddr,roguepk,pk);
|
||||
//fprintf(stderr,"call extractgame\n");
|
||||
if ( (keystrokes= rogue_extractgame(0,str,&numkeys,newdata,seed,playertxid,cp,gametxid,rogueaddr)) != 0 )
|
||||
{
|
||||
free(keystrokes);
|
||||
//fprintf(stderr,"extracted.(%s)\n",str);
|
||||
if ( newdata == playerdata )
|
||||
{
|
||||
good++;
|
||||
fprintf(stderr,"%s good.%d bad.%d\n",gametxid.GetHex().c_str(),good,bad);
|
||||
return(0);
|
||||
}
|
||||
newdata[10] = newdata[11] = playerdata[10] = playerdata[11] = 0;
|
||||
if ( newdata == playerdata )
|
||||
{
|
||||
good++;
|
||||
fprintf(stderr,"%s matched after clearing maxstrength good.%d bad.%d\n",gametxid.GetHex().c_str(),good,bad);
|
||||
return(0);
|
||||
}
|
||||
bad++;
|
||||
for (i=0; i<playerdata.size(); i++)
|
||||
((uint8_t *)&P)[i] = playerdata[i];
|
||||
if ( P.gold <= 0 || P.hitpoints <= 0 || (P.strength&0xffff) <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0 )
|
||||
{
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
}
|
||||
fprintf(stderr,"%s playerdata: gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d\n",gametxid.GetHex().c_str(),P.gold,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel);
|
||||
fprintf(stderr,"newdata[%d] != playerdata[%d], numkeys.%d %s pub.%s playertxid.%s good.%d bad.%d\n",(int32_t)newdata.size(),(int32_t)playerdata.size(),numkeys,rogueaddr,pubkey33_str(str2,(uint8_t *)&pk),playertxid.GetHex().c_str(),good,bad);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
bool rogue_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx)
|
||||
{
|
||||
CScript scriptPubKey; std::vector<uint8_t> vopret; uint8_t *script,e,f,funcid; int32_t i,maxplayers,decoded=0,regslot,ind,err,dispflag,gameheight,score,numvouts; CTransaction vintx,gametx; CPubKey pk; uint256 hashBlock,gametxid,tokenid,batontxid,playertxid,ptxid; int64_t buyin; std::vector<uint8_t> playerdata,keystrokes; std::string symbol,pname;
|
||||
|
||||
189
src/musigtest.py
189
src/musigtest.py
@@ -1,189 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import platform
|
||||
import os
|
||||
import re
|
||||
import json
|
||||
import random
|
||||
import base58
|
||||
import binascii
|
||||
import hashlib
|
||||
import sys
|
||||
import time
|
||||
from slickrpc import Proxy
|
||||
|
||||
# fucntion to define rpc_connection
|
||||
def def_credentials(chain):
|
||||
rpcport = '';
|
||||
operating_system = platform.system()
|
||||
if operating_system == 'Darwin':
|
||||
ac_dir = os.environ['HOME'] + '/Library/Application Support/Komodo'
|
||||
elif operating_system == 'Linux':
|
||||
ac_dir = os.environ['HOME'] + '/.komodo'
|
||||
elif operating_system == 'Windows':
|
||||
ac_dir = '%s/komodo/' % os.environ['APPDATA']
|
||||
if chain == 'KMD':
|
||||
coin_config_file = str(ac_dir + '/komodo.conf')
|
||||
else:
|
||||
coin_config_file = str(ac_dir + '/' + chain + '/' + chain + '.conf')
|
||||
with open(coin_config_file, 'r') as f:
|
||||
for line in f:
|
||||
l = line.rstrip()
|
||||
if re.search('rpcuser', l):
|
||||
rpcuser = l.replace('rpcuser=', '')
|
||||
elif re.search('rpcpassword', l):
|
||||
rpcpassword = l.replace('rpcpassword=', '')
|
||||
elif re.search('rpcport', l):
|
||||
rpcport = l.replace('rpcport=', '')
|
||||
if len(rpcport) == 0:
|
||||
if chain == 'KMD':
|
||||
rpcport = 7771
|
||||
else:
|
||||
print("rpcport not in conf file, exiting")
|
||||
print("check " + coin_config_file)
|
||||
exit(1)
|
||||
return (Proxy("http://%s:%s@127.0.0.1:%d" % (rpcuser, rpcpassword, int(rpcport))))
|
||||
|
||||
|
||||
# generate address, validate address, dump private key
|
||||
def genvaldump(rpc_connection):
|
||||
# get new address
|
||||
address = rpc_connection.getnewaddress()
|
||||
# validate address
|
||||
validateaddress_result = rpc_connection.validateaddress(address)
|
||||
pubkey = validateaddress_result['pubkey']
|
||||
address = validateaddress_result['address']
|
||||
# dump private key for the address
|
||||
privkey = rpc_connection.dumpprivkey(address)
|
||||
# function output
|
||||
output = [pubkey, privkey, address]
|
||||
return(output)
|
||||
|
||||
CHAIN = 'MUSIG' #sys.argv[1]
|
||||
|
||||
rpc = def_credentials(CHAIN)
|
||||
|
||||
pubkeys = []
|
||||
address_info = []
|
||||
ret = input('Do you want to generate new pubkeys? ').lower()
|
||||
|
||||
if ret.startswith('y'):
|
||||
numpks = int(input('Enter number of pubkeys to combine: '))
|
||||
if os.path.isfile("list.json"):
|
||||
print('Already have list.json, move it if you would like to generate a new set.')
|
||||
sys.exit(0)
|
||||
while len(address_info) < numpks:
|
||||
addressinfo = genvaldump(rpc)
|
||||
address_info.append(addressinfo)
|
||||
f = open("list.json", "w+")
|
||||
f.write(json.dumps(address_info))
|
||||
else:
|
||||
if os.path.isfile("list.json"):
|
||||
with open('list.json') as list:
|
||||
address_info = json.load(list)
|
||||
else:
|
||||
sys.exit('No list.json you need to create new pubkeys!')
|
||||
|
||||
for addressinfo in address_info:
|
||||
pubkeys.append(addressinfo[0])
|
||||
|
||||
ret = rpc.setpubkey(pubkeys[0])
|
||||
ret = rpc.cclib("combine", "18", str(pubkeys))
|
||||
pkhash = str(ret['pkhash'])
|
||||
combinedpk = str(ret['combined_pk'])
|
||||
print('Your combined pubkey is: ' + combinedpk)
|
||||
print('Your pkhash is: ' + pkhash)
|
||||
amount = int(input('Enter amount to send: '))
|
||||
tmp = str([combinedpk, amount])
|
||||
hex = rpc.cclib("send", "18", tmp)['hex']
|
||||
senttxid = rpc.sendrawtransaction(hex)
|
||||
print('Your senttxid is: ' + senttxid)
|
||||
|
||||
print("Waiting for tx to be confirmed")
|
||||
while True:
|
||||
confirmed = int(rpc.gettransaction(senttxid)["confirmations"])
|
||||
if not confirmed:
|
||||
time.sleep(10)
|
||||
else:
|
||||
print('SentTX confirmed')
|
||||
break
|
||||
|
||||
scriptPubKey = rpc.getrawtransaction(senttxid,1)['vout'][1]['scriptPubKey']['hex']
|
||||
print('Your scriptPubKey is: ' + scriptPubKey)
|
||||
tmp = str([senttxid, scriptPubKey])
|
||||
msg = rpc.cclib("calcmsg", "18", tmp)['msg']
|
||||
print('Your msg is: ' + msg)
|
||||
|
||||
i = 0;
|
||||
commitments = []
|
||||
for pubkey in pubkeys:
|
||||
ret = rpc.setpubkey(pubkey)
|
||||
tmp = str([i, len(pubkeys), combinedpk, pkhash, msg])
|
||||
commitments.append(rpc.cclib("session", "18", tmp)['commitment'])
|
||||
i = i + 1
|
||||
|
||||
#print(commitments)
|
||||
|
||||
i = 0
|
||||
nonces = []
|
||||
for pubkey in pubkeys:
|
||||
ret = rpc.setpubkey(pubkey)
|
||||
n = 0
|
||||
for commitment in commitments:
|
||||
tmp = str([i, pkhash, n, commitment])
|
||||
ret = rpc.cclib("commit", "18", tmp)
|
||||
try:
|
||||
nonces.append(ret['nonce'])
|
||||
except:
|
||||
x = 1
|
||||
n = n + 1
|
||||
i = i + 1
|
||||
|
||||
#print(nonces)
|
||||
|
||||
i = 0
|
||||
partialsigs = []
|
||||
for pubkey in pubkeys:
|
||||
ret = rpc.setpubkey(pubkey)
|
||||
n = 0
|
||||
for nonce in nonces:
|
||||
tmp = str([i, pkhash, n, nonce])
|
||||
ret = rpc.cclib("nonce", "18", tmp)
|
||||
try:
|
||||
partialsigs.append(ret['partialsig'])
|
||||
except:
|
||||
x = 1
|
||||
n = n + 1
|
||||
i = i + 1
|
||||
|
||||
#print(partialsigs)
|
||||
|
||||
i = 0
|
||||
combinedsigs = []
|
||||
for pubkey in pubkeys:
|
||||
ret = rpc.setpubkey(pubkey)
|
||||
n = 0
|
||||
for partialsig in partialsigs:
|
||||
tmp = str([i, pkhash, n, partialsig])
|
||||
ret = rpc.cclib("partialsig", "18", tmp)
|
||||
try:
|
||||
combinedsigs.append(ret['combinedsig'])
|
||||
except:
|
||||
x = 1
|
||||
n = n + 1
|
||||
i = i + 1
|
||||
|
||||
#print(combinedsigs)
|
||||
|
||||
tmp = str([msg, combinedpk, combinedsigs[0]])
|
||||
ret = rpc.cclib("verify", "18", tmp)
|
||||
|
||||
#print(ret)
|
||||
|
||||
tmp = str([senttxid, scriptPubKey, combinedsigs[0]])
|
||||
ret = rpc.cclib("spend", "18", tmp)
|
||||
|
||||
print(ret)
|
||||
|
||||
ret = rpc.sendrawtransaction(ret['hex'])
|
||||
|
||||
print(ret)
|
||||
@@ -5308,8 +5308,8 @@ UniValue setpubkey(const UniValue& params, bool fHelp)
|
||||
|
||||
char Raddress[64];
|
||||
uint8_t pubkey33[33];
|
||||
//if ( NOTARY_PUBKEY33[0] == 0 )
|
||||
//{
|
||||
if ( NOTARY_PUBKEY33[0] == 0 )
|
||||
{
|
||||
if (strlen(params[0].get_str().c_str()) == 66)
|
||||
{
|
||||
decode_hex(pubkey33,33,(char *)params[0].get_str().c_str());
|
||||
@@ -5337,14 +5337,14 @@ UniValue setpubkey(const UniValue& params, bool fHelp)
|
||||
USE_EXTERNAL_PUBKEY = 1;
|
||||
}
|
||||
} else result.push_back(Pair("error", "pubkey is wrong length, must be 66 char hex string."));
|
||||
/*}
|
||||
}
|
||||
else
|
||||
{
|
||||
result.push_back(Pair("error", "Can only set pubkey once, to change it you need to restart your daemon, pubkey in use is below."));
|
||||
pubkey2addr((char *)Raddress,(uint8_t *)NOTARY_PUBKEY33);
|
||||
std::string address_ret; address_ret.assign(Raddress);
|
||||
result.push_back(Pair("address",address_ret));
|
||||
}*/
|
||||
}
|
||||
result.push_back(Pair("pubkey", NOTARY_PUBKEY));
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user