Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions common/proof.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "uint256.h"
#include "key.h"
#include <walleve/stream/datastream.h>
#include "destination.h"

class CProofOfSecretShare
{
Expand Down Expand Up @@ -58,17 +59,18 @@ class CProofOfHashWork : public CProofOfSecretShare
public:
unsigned char nAlgo;
unsigned char nBits;
CDestination destMint;
uint256 nNonce;
protected:
virtual void ToStream(walleve::CWalleveODataStream& os) override
{
CProofOfSecretShare::ToStream(os);
os << nAlgo << nBits << nNonce;
os << nAlgo << nBits << destMint.prefix << destMint.data << nNonce;
}
virtual void FromStream(walleve::CWalleveIDataStream& is) override
{
CProofOfSecretShare::FromStream(is);
is >> nAlgo >> nBits >> nNonce;
is >> nAlgo >> nBits >> destMint.prefix >> destMint.data >> nNonce;
}
};

Expand All @@ -77,19 +79,20 @@ class CProofOfHashWorkCompact
public:
unsigned char nAlgo;
unsigned char nBits;
CDestination destMint;
uint256 nNonce;

public:
enum { PROOFHASHWORK_SIZE = 34 };
enum { PROOFHASHWORK_SIZE = 67 };
void Save(std::vector<unsigned char>& vchProof)
{
unsigned char *p = &vchProof[vchProof.size() - PROOFHASHWORK_SIZE];
*p++ = nAlgo; *p++ = nBits; *((uint256*)p) = nNonce;
*p++ = nAlgo; *p++ = nBits; *p++ = destMint.prefix; *((uint256*)p) = destMint.data; p += 32; *((uint256*)p) = nNonce;
}
void Load(const std::vector<unsigned char>& vchProof)
{
const unsigned char *p = &vchProof[vchProof.size() - PROOFHASHWORK_SIZE];
nAlgo = *p++; nBits = *p++; nNonce = *((uint256*)p);
nAlgo = *p++; nBits = *p++; destMint.prefix = *p++; destMint.data = *((uint256*)p); p += 32; nNonce = *((uint256*)p);
}
};

Expand Down
12 changes: 10 additions & 2 deletions script/template/rpc.json
Original file line number Diff line number Diff line change
Expand Up @@ -2558,6 +2558,14 @@
"request": {
"type": "object",
"content": {
"spent": {
"type": "string",
"desc": "spent address"
},
"privkey": {
"type": "string",
"desc": "private key"
},
"prev": {
"type": "string",
"desc": "prev block hash",
Expand Down Expand Up @@ -2607,11 +2615,11 @@
},
"example": [
{
"request": "multiverse-cli getwork 7ee748e9a827d476d1b4ddb77dc8f9bad779f7b71593d5c5bf73b535e1cc2446",
"request": "multiverse-cli getwork 1pdr1knaaa4fzr846v89g3q2tzb8pbvbavbbft8xppkky0mqnmsq8gn5y ceae964a1119f110b0cff3614426dd692f8467a95cc2c276e523efc63c5e5031 7ee748e9a827d476d1b4ddb77dc8f9bad779f7b71593d5c5bf73b535e1cc2446",
"response": "{\"work\":{\"prevblockhash\":\"f734bb6bc12ab4058532113cfe6a3412d1036eae25f60a97ee1b17effc6e74de\",\"prevblocktime\":1538142032,\"algo\":1,\"bits\":25,\"data\":\"01000100822fae5bde746efcef171bee970af625ae6e03d112346afe3c11328505b42ac16bbb34f74300000000000000000000000000000000000000000000000000000000000000000001190000000000000000000000000000000000000000000000000000000000000000\"}}"
},
{
"request": "curl -d '{\"id\":1,\"method\":\"getwork\",\"jsonrpc\":\"2.0\",\"params\":{\"prev\":\"7ee748e9a827d476d1b4ddb77dc8f9bad779f7b71593d5c5bf73b535e1cc2446\"}}' http://127.0.0.1:6812",
"request": "curl -d '{\"id\":1,\"method\":\"getwork\",\"jsonrpc\":\"2.0\",\"params\":{\"spent\":\"1pdr1knaaa4fzr846v89g3q2tzb8pbvbavbbft8xppkky0mqnmsq8gn5y\",\"privkey\":\"ceae964a1119f110b0cff3614426dd692f8467a95cc2c276e523efc63c5e5031\",\"prev\":\"7ee748e9a827d476d1b4ddb77dc8f9bad779f7b71593d5c5bf73b535e1cc2446\"}}' http://127.0.0.1:6812",
"response": "{\"id\":1,\"jsonrpc\":\"2.0\",\"result\":{\"work\":{\"prevblockhash\":\"f734bb6bc12ab4058532113cfe6a3412d1036eae25f60a97ee1b17effc6e74de\",\"prevblocktime\":1538142032,\"algo\":1,\"bits\":25,\"data\":\"01000100822fae5bde746efcef171bee970af625ae6e03d112346afe3c11328505b42ac16bbb34f74300000000000000000000000000000000000000000000000000000000000000000001190000000000000000000000000000000000000000000000000000000000000000\"}}}"
}
],
Expand Down
1 change: 1 addition & 0 deletions src/blockmaker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ bool CBlockMaker::CreateProofOfWorkBlock(CBlock& block)
CProofOfHashWorkCompact proof;
proof.nAlgo = nAlgo;
proof.nBits = nBits;
proof.destMint = destSendTo;
proof.nNonce = 0;
proof.Save(block.vchProof);

Expand Down
4 changes: 4 additions & 0 deletions src/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,10 @@ MvErr CMvCoreProtocol::VerifyProofOfWork(const CBlock& block, const CBlockIndex*
{
return MV_ERR_BLOCK_PROOF_OF_WORK_INVALID;
}
if (proof.destMint != block.txMint.sendTo)
{
return MV_ERR_BLOCK_PROOF_OF_WORK_INVALID;
}

uint256 hashTarget = (~uint256(uint64(0)) >> GetProofOfWorkRunTimeBits(nBits,block.GetBlockTime(),pIndexPrev->GetBlockTime()));

Expand Down
45 changes: 34 additions & 11 deletions src/miner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,21 +150,41 @@ bool CMiner::HandleEvent(CWalleveEventHttpGetRsp& event)
else if (spResp->IsSuccessful())
{
auto spResult = CastResultPtr<CGetWorkResult>(spResp->spResult);
cout << spResp->spResult->Method() << endl;
if (spResult->fResult.IsValid())
//cout << spResp->spResult->Method() << endl;


int nRet = 0;
if (!spResult->fResult.IsValid())
{
nRet = -1;
cout << "get work fResult invalid." << endl;
}
else if (!spResult->work.IsValid())
{
nRet = -2;
cout << "get work work invalid." << endl;
}
else if (!spResult->fResult)
{
nRet = -3;
cout << "get work fResult is false." << endl;
}
else
{
cout << "get work success." << endl;
}

if (nRet != 0)
{
if (!spResult->fResult)
{
{
boost::unique_lock<boost::mutex> lock(mutex);
boost::unique_lock<boost::mutex> lock(mutex);

workCurrent.SetNull();
nMinerStatus = MINER_HOLD;
}
condMiner.notify_all();
workCurrent.SetNull();
nMinerStatus = MINER_HOLD;
}
condMiner.notify_all();
}
else if (spResult->work.IsValid())
else
{
{
boost::unique_lock<boost::mutex> lock(mutex);
Expand Down Expand Up @@ -264,7 +284,10 @@ bool CMiner::GetWork()
try
{
// nNonceGetWork += 2;
auto spParam = MakeCGetWorkParamPtr(workCurrent.hashPrev.GetHex());
auto spParam = MakeCGetWorkParamPtr();
spParam->strSpent = strAddrSpent;
spParam->strPrivkey = strMintKey;
spParam->strPrev = workCurrent.hashPrev.GetHex();
CRPCReqPtr spReq = MakeCRPCReqPtr(nNonceGetWork, spParam);
return SendRequest(nNonceGetWork, spReq->Serialize());
}
Expand Down
2 changes: 1 addition & 1 deletion src/mvbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ class IService : public walleve::IWalleveBase
virtual bool SynchronizeWalletTx(const CDestination& destNew) = 0;
virtual bool ResynchronizeWalletTx() = 0;
/* Mint */
virtual bool GetWork(std::vector<unsigned char>& vchWorkData, uint256& hashPrev, uint32& nPrevTime, int& nAlgo, int& nBits) = 0;
virtual bool GetWork(std::vector<unsigned char>& vchWorkData, uint256& hashPrev, uint32& nPrevTime, int& nAlgo, int& nBits, CTemplateMintPtr& templMint) = 0;
virtual MvErr SubmitWork(const std::vector<unsigned char>& vchWorkData, CTemplateMintPtr& templMint, crypto::CKey& keyMint, uint256& hashBlock) = 0;
};

Expand Down
36 changes: 22 additions & 14 deletions src/rpcmod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2046,37 +2046,45 @@ CRPCResultPtr CRPCModWorker::RPCDecodeTransaction(CRPCParamPtr param)
// /* Mint */
CRPCResultPtr CRPCModWorker::RPCGetWork(CRPCParamPtr param)
{
//getwork <"spent"> <"privkey"> ("prev")
auto spParam = CastParamPtr<CGetWorkParam>(param);

//getwork ("prev")
uint256 hashPrev;
if (!pService->GetBlockHash(pCoreProtocol->GetGenesisBlockHash(),-1,hashPrev))
CMvAddress addrSpent(spParam->strSpent);
uint256 nPriv(spParam->strPrivkey);
if (addrSpent.IsNull() || !addrSpent.IsPubKey())
{
throw CRPCException(RPC_INTERNAL_ERROR, "The primary chain is invalid.");
throw CRPCException(RPC_INVALID_ADDRESS_OR_KEY,"Invalid spent address");
}

uint256 inPrev;
if (inPrev.SetHex(spParam->strPrev) != spParam->strPrev.size())
crypto::CKey key;
if (!key.SetSecret(crypto::CCryptoKeyData(nPriv.begin(),nPriv.end())))
{
throw CRPCException(RPC_INTERNAL_ERROR, "Invalid prev.");
throw CRPCException(RPC_INVALID_ADDRESS_OR_KEY,"Invalid private key");
}

auto spResult = MakeCGetWorkResultPtr();
if (hashPrev == uint256(spParam->strPrev))
crypto::CPubKey pubkeySpent;
if (addrSpent.GetPubKey(pubkeySpent) && pubkeySpent == key.GetPubKey())
{
spResult->fResult = true;
return spResult;
throw CRPCException(RPC_INVALID_ADDRESS_OR_KEY,"Invalid spent address or private key");
}
CTemplateMintPtr ptr = CTemplateMint::CreateTemplatePtr(new CTemplateProof(key.GetPubKey(),static_cast<CDestination&>(addrSpent)));
if (ptr == NULL)
{
throw CRPCException(RPC_INVALID_ADDRESS_OR_KEY,"Invalid mint template");
}

auto spResult = MakeCGetWorkResultPtr();

vector<unsigned char> vchWorkData;
uint256 hashPrev;
uint32 nPrevTime;
int nAlgo,nBits;
if (!pService->GetWork(vchWorkData,hashPrev,nPrevTime,nAlgo,nBits))
if (!pService->GetWork(vchWorkData,hashPrev,nPrevTime,nAlgo,nBits,ptr))
{
spResult->fResult = false;
return spResult;
}

spResult->fResult = true;

spResult->work.strPrevblockhash = hashPrev.GetHex();
spResult->work.nPrevblocktime = nPrevTime;
spResult->work.nAlgo = nAlgo;
Expand Down
3 changes: 2 additions & 1 deletion src/service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ bool CService::ResynchronizeWalletTx()
return pWallet->ResynchronizeWalletTx();
}

bool CService::GetWork(vector<unsigned char>& vchWorkData,uint256& hashPrev,uint32& nPrevTime,int& nAlgo,int& nBits)
bool CService::GetWork(std::vector<unsigned char>& vchWorkData, uint256& hashPrev, uint32& nPrevTime, int& nAlgo, int& nBits, CTemplateMintPtr& templMint)
{
CBlock block;
block.nType = CBlock::BLOCK_PRIMARY;
Expand Down Expand Up @@ -566,6 +566,7 @@ bool CService::GetWork(vector<unsigned char>& vchWorkData,uint256& hashPrev,uint
proof.nAgreement = 0;
proof.nAlgo = nAlgo;
proof.nBits = nBits;
proof.destMint = CDestination(templMint->GetTemplateId());
proof.nNonce = 0;
proof.Save(block.vchProof);

Expand Down
2 changes: 1 addition & 1 deletion src/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class CService : public IService
bool SynchronizeWalletTx(const CDestination& destNew) override;
bool ResynchronizeWalletTx() override;
/* Mint */
bool GetWork(std::vector<unsigned char>& vchWorkData,uint256& hashPrev,uint32& nPrevTime,int& nAlgo,int& nBits) override;
bool GetWork(std::vector<unsigned char>& vchWorkData, uint256& hashPrev, uint32& nPrevTime, int& nAlgo, int& nBits, CTemplateMintPtr& templMint) override;
MvErr SubmitWork(const std::vector<unsigned char>& vchWorkData,CTemplateMintPtr& templMint,crypto::CKey& keyMint,uint256& hashBlock) override;
/* Util */
protected:
Expand Down