bool GetRegScript(map<string, string>& mapRegScript) { CRegID regId; vector<unsigned char> vScript; if (pScriptDBTip == nullptr) return false; assert(pScriptDBTip->Flush()); int nCount(0); if (!pScriptDBTip->GetScriptCount(nCount)) return false; if (!pScriptDBTip->GetScript(0, regId, vScript)) return false; string strRegID = HexStr(regId.GetVec6()); string strScript = HexStr(vScript.begin(), vScript.end()); mapRegScript.insert(make_pair(strRegID, strScript)); while (pScriptDBTip->GetScript(1, regId, vScript)) { strRegID = HexStr(regId.GetVec6()); strScript = HexStr(vScript.begin(), vScript.end()); mapRegScript.insert(make_pair(strRegID, strScript)); } return true; }
vector_unsigned_char CVmRunEvn::GetAccountID(CVmOperate value) { vector_unsigned_char accountid; if (value.nacctype == regid) { accountid.assign(value.accountid, value.accountid + 6); } else if (value.nacctype == base58addr) { string addr(value.accountid,value.accountid+sizeof(value.accountid)); CKeyID KeyId = CKeyID(addr); CRegID regid; if(m_view->GetRegId(CUserID(KeyId), regid)){ accountid.assign(regid.GetVec6().begin(),regid.GetVec6().end()); }else{ accountid.assign(value.accountid, value.accountid + 34); } } return accountid; }
BOOST_FIXTURE_TEST_CASE(transfer_test, CSysAccountTest) { ResetEnv(); BOOST_CHECK(0==chainActive.Height()); //转账 string strRegAddr = "dkJwhBs2P2SjbQWt5Bz6vzjqUhXTymvsGr"; string strSrcRegID = "000000000400"; uint64_t nMoney = 10000000; BOOST_CHECK(SendMoney(strSrcRegID,strRegAddr,nMoney)); BOOST_CHECK(GenerateOneBlock()); //确认转账成功 uint64_t nFreeMoney = GetBalance(strRegAddr); BOOST_CHECK(nFreeMoney == nMoney); //使用一个没有注册过的keyID地址测试,看是能够注册,用getaccountinfo 检查regid是否存在 string strTxHash; CRegID regID; BOOST_CHECK(RegisterAccount(strRegAddr,10000,strTxHash)); BOOST_CHECK(GenerateOneBlock()); BOOST_CHECK(GetRegID(strRegAddr,regID)); BOOST_CHECK(false == regID.IsEmpty()); //使用一个注册过的keyID地址测试,看是否能够注册成功 string strResigterd("dps9hqUmBAVGVg7ijLGPcD9CJz9HHiTw6H"); BOOST_CHECK(!RegisterAccount(strRegAddr,10000,strTxHash)); //用getnewaddress获取一个没有设置挖坑的公钥地址,注册账户最后一个参数是true,看此地址是否能够注册成功 string strNewKeyID; BOOST_CHECK(GetNewAddr(strNewKeyID,true)); //用一个注册的地址和一个未注册的地址来发一个交易,看是否能够发送成功 string strUnRegister("dgZjR2S98gmdvXDzwKASxKiaGr9Dw1GD8F"); vector<unsigned char> vRegID = regID.GetVec6(); nMoney = nMoney/10; BOOST_CHECK(SendMoney(HexStr(vRegID),strUnRegister,nMoney, 10000)); BOOST_CHECK(GenerateOneBlock()); //确认转账成功 nFreeMoney = GetBalance(strUnRegister); BOOST_CHECK(nFreeMoney == nMoney); }
CUserID CID::GetUserId() { if (1< vchData.size() && vchData.size() <= 10) { CRegID regId; regId.SetRegIDByCompact(vchData); return CUserID(regId); } else if (vchData.size() == 33) { CPubKey pubKey(vchData); return CUserID(pubKey); } else if (vchData.size() == 20) { uint160 data = uint160(vchData); CKeyID keyId(data); return CUserID(keyId); } else if(vchData.empty()) { return CNullID(); } else { LogPrint("ERROR", "vchData:%s, len:%d\n", HexStr(vchData).c_str(), vchData.size()); throw ios_base::failure("GetUserId error from CID"); } return CNullID(); }
bool CVmRunEvn::OpeatorAccount(const vector<CVmOperate>& listoperate, CAccountViewCache& view, const int nCurHeight) { NewAccont.clear(); for (auto& it : listoperate) { // CTransaction* tx = static_cast<CTransaction*>(listTx.get()); // CFund fund; // memcpy(&fund.value,it.money,sizeof(it.money)); // fund.nHeight = it.outheight; uint64_t value; memcpy(&value, it.money, sizeof(it.money)); auto tem = std::make_shared<CAccount>(); // vector_unsigned_char accountid = GetAccountID(it); // if (accountid.size() == 0) { // return false; // } // vector_unsigned_char accountid(it.accountid,it.accountid+sizeof(it.accountid)); vector_unsigned_char accountid = GetAccountID(it); CRegID userregId; CKeyID userkeyid; if(accountid.size() == 6){ userregId.SetRegID(accountid); if(!view.GetAccount(CUserID(userregId), *tem.get())){ return false; /// 账户不存在 } }else{ string sharkfundaddr(accountid.begin(), accountid.end()); userkeyid = CKeyID(sharkfundaddr); if(!view.GetAccount(CUserID(userkeyid), *tem.get())) { tem->keyID = userkeyid; /// 未产生过交易记录的账户 //return false; /// 账户不存在 } } shared_ptr<CAccount> vmAccount = GetAccount(tem); if (vmAccount.get() == NULL) { RawAccont.push_back(tem); vmAccount = tem; } LogPrint("vm", "account id:%s\r\n", HexStr(accountid).c_str()); LogPrint("vm", "befer account:%s\r\n", vmAccount.get()->ToString().c_str()); bool ret = false; // vector<CScriptDBOperLog> vAuthorLog; //todolist // if(IsSignatureAccount(vmAccount.get()->regID) || vmAccount.get()->regID == boost::get<CRegID>(tx->appRegId)) { ret = vmAccount.get()->OperateAccount((OperType)it.opeatortype, value, nCurHeight); } // else{ // ret = vmAccount.get()->OperateAccount((OperType)it.opeatortype, fund, *m_ScriptDBTip, vAuthorLog, height, &GetScriptRegID().GetVec6(), true); // } // LogPrint("vm", "after account:%s\r\n", vmAccount.get()->ToString().c_str()); if (!ret) { return false; } NewAccont.push_back(vmAccount); // m_dblog->insert(m_dblog->end(), vAuthorLog.begin(), vAuthorLog.end()); } return true; }