diff --git a/contracts/hddpool/hddpool.abi b/contracts/hddpool/hddpool.abi index 017210c3222f95f846fb9e97372d49c9f0581741..8ad4686bfccc78a1b7411a7ffe9fe655e5ebdcfc 100644 --- a/contracts/hddpool/hddpool.abi +++ b/contracts/hddpool/hddpool.abi @@ -109,7 +109,53 @@ { "name": "clearall", "base": "", + "fields": [ + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "clsallpools", + "base": "", "fields": [] + }, + { + "name": "regstrpool", + "base": "", + "fields": [ + { + "name": "pool_id", + "type": "name" + }, + { + "name": "pool_owner", + "type": "name" + }, + { + "name": "max_space", + "type": "uint64" + } + ] + }, + { + "name": "addm2pool", + "base": "", + "fields": [ + { + "name": "minerid", + "type": "uint64" + }, + { + "name": "pool_id", + "type": "name" + }, + { + "name": "minerowner", + "type": "name" + } + ] }, { "name": "getbalance", @@ -197,7 +243,78 @@ "name": "last_hdd_time", "type": "uint64" } - + ] + }, + { + "name": "miner2acc", + "base": "", + "fields": [ + { + "name": "minerid", + "type": "uint64" + }, + { + "name": "owner", + "type": "name" + } + ] + }, + { + "name": "storepool", + "base": "", + "fields": [ + { + "name": "pool_id", + "type": "name" + }, + { + "name": "pool_owner", + "type": "name" + }, + { + "name": "max_space", + "type": "uint64" + }, + { + "name": "space_left", + "type": "uint64" + } + ] + }, + { + "name": "spoolminers", + "base": "", + "fields": [ + { + "name": "pool_id", + "type": "name" + }, + { + "name": "miner_id", + "type": "uint64" + }, + { + "name": "miner_owner", + "type": "name" + }, + { + "name": "space", + "type": "uint64" + } + ] + }, + { + "name": "miner2pool", + "base": "", + "fields": [ + { + "name": "minerid", + "type": "uint64" + }, + { + "name": "pool_id", + "type": "name" + } ] }, { @@ -368,7 +485,22 @@ "name": "subhspace", "type": "subhspace", "ricardian_contract": "" - } + }, + { + "name": "clsallpools", + "type": "clsallpools", + "ricardian_contract": "" + }, + { + "name": "regstrpool", + "type": "regstrpool", + "ricardian_contract": "" + }, + { + "name": "addm2pool", + "type": "addm2pool", + "ricardian_contract": "" + } ], "tables": [ { @@ -406,6 +538,27 @@ "key_names": [], "key_types": [] }, + { + "name": "storepool", + "type": "storepool", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "spoolminers", + "type": "spoolminers", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "miner2pool", + "type": "miner2pool", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, { "name": "maccount", "type": "maccount", @@ -413,6 +566,13 @@ "key_names": [], "key_types": [] }, + { + "name": "miner2acc", + "type": "miner2acc", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, { "name": "userhdd", "type": "userhdd", diff --git a/contracts/hddpool/hddpool.cpp b/contracts/hddpool/hddpool.cpp index e84bdee2a1631cbeae1965ef4a3b560797ab914c..0ab4b83570cfb88af527050f4ff3f59034e6ca45 100644 --- a/contracts/hddpool/hddpool.cpp +++ b/contracts/hddpool/hddpool.cpp @@ -542,10 +542,18 @@ void hddpool::subhspace(name user, uint64_t space, name caller) void hddpool::newmaccount(name owner, uint64_t minerid, name caller) { eosio_assert(is_account(owner), "owner invalidate"); - eosio_assert(is_account(caller), "caller not an account."); - eosio_assert(is_bp_account(caller.value), "caller not a BP account."); + eosio_assert(is_account(caller), "caller not an account"); + eosio_assert(is_bp_account(caller.value), "caller not a BP account"); require_auth( caller ); + miner2acc_index _miner2acc(_self, minerid); + auto itminer2acc = _miner2acc.find(minerid); + eosio_assert(itminer2acc == _miner2acc.end(), "minerid already registered \n"); + _miner2acc.emplace(_self, [&](auto &row) { + row.minerid = minerid; + row.owner = owner; + }); + //maccount_index _maccount(_self, _self); maccount_index _maccount(_self, owner.value); if (_maccount.begin() == _maccount.end()) @@ -555,7 +563,7 @@ void hddpool::newmaccount(name owner, uint64_t minerid, name caller) } auto it = _maccount.find(minerid); - eosio_assert(it == _maccount.end(), "minerid already exist in maccount table \n"); + eosio_assert(it == _maccount.end(), "minerid already exist in maccount table"); _maccount.emplace(_self, [&](auto &row) { row.minerid = minerid; @@ -594,9 +602,24 @@ void hddpool::addmprofit(name owner, uint64_t minerid, uint64_t space, name call //maccount_index _maccount(_self, _self); maccount_index _maccount(_self, owner.value); auto it = _maccount.find(minerid); - eosio_assert(it != _maccount.end(), "minerid not register \n"); + eosio_assert(it != _maccount.end(), "minerid not register"); //name owner = it->owner; + //check store pool's space left -- (is it enough) -- start ---------- + miner2pool_index _miner2pool(_self, minerid); + auto itmminer2pool = _miner2pool.find(minerid); + if(itmminer2pool != _miner2pool.end()) { + storepool_index _storepool(_self, _self); + auto itstorepool = _storepool.find(itmminer2pool->pool_id.value); + if(itstorepool != _storepool.end()) { + eosio_assert(itstorepool->space_left >= space, "pool space not enough"); + _storepool.modify(itstorepool, _self, [&](auto &row) { + row.space_left -= space; + }); + } + } + //check store pool's space left -- (is it enough) -- end ---------- + int64_t profit_delta = 0; //每周期收益 += (生产空间*数据分片大小/1GB)*(记账周期/ 1年) profit_delta = (int64_t)(((double)(space * data_slice_size) / (double)one_gb) * ((double)fee_cycle / (double)seconds_in_one_year) * 100000000); @@ -677,10 +700,21 @@ void hddpool::calcmbalance(name owner, uint64_t minerid) }); } -void hddpool::clearall() +void hddpool::clearall(name owner) { require_auth(_self); + maccount_index _maccount(_self, owner.value); + while(_maccount.begin() != _maccount.end()) { + auto itmaccount = _maccount.begin(); + uint64_t minerid = itmaccount->minerid; + miner2acc_index _miner2acc (_self, minerid); + auto itminer2acc = _miner2acc.find(minerid); + if(itminer2acc != _miner2acc.end()) { + _miner2acc.erase(itminer2acc); + } + _maccount.erase(_maccount.begin()); + } /* if(is_bp_account(N(producer1))) { print( "procuder1 is bp account\n" ); @@ -706,14 +740,92 @@ void hddpool::clearall() _maccount.erase(_maccount.begin()); */ + /* auto itr = _hmarket.find(HDDCORE_SYMBOL_BANCOR); - //print( "check hdd market\n" ); - if (itr != _hmarket.end()) { _hmarket.erase(_hmarket.begin()); } + */ +} + +void hddpool::clsallpools() +{ + require_auth(_self); + + storepool_index _storepool( _self , _self ); + while (_storepool.begin() != _storepool.end()) { + auto itpool = _storepool.begin(); + name pool_id = itpool->pool_id; + + spoolminers_index _spoolminers( _self, pool_id.value); + while(_spoolminers.begin() != _spoolminers.end()) { + auto itspollminers = _spoolminers.begin(); + uint64_t minerid = itspollminers->minerid; + miner2pool_index _miner2pool (_self, minerid); + auto itminer2pool = _miner2pool.find(minerid); + if(itminer2pool != _miner2pool.end()) { + _miner2pool.erase(itminer2pool); + } + _spoolminers.erase(_spoolminers.begin()); + } + + _storepool.erase(_storepool.begin()); + + } +} + +void hddpool::regstrpool(name pool_id, name pool_owner, uint64_t max_space) +{ + storepool_index _storepool( _self , _self ); + auto itmstorepool = _storepool.find(pool_id.value); + eosio_assert(itmstorepool == _storepool.end(), "storepool already registered \n"); + _storepool.emplace(_self, [&](auto &row) { + row.pool_id = pool_id; + row.pool_owner = pool_owner; + row.max_space = max_space; + row.space_left = max_space; + }); +} + +void hddpool::addm2pool(uint64_t minerid, name pool_id, name minerowner) +{ + //miner2acc_index _miner2acc(_self, minerid); + //auto itminer2acc = _miner2acc.find(minerid); + //eosio_assert(itminer2acc != _miner2acc.end(), "minerid is not registered \n"); + + miner2pool_index _miner2pool(_self, minerid); + auto itmminer2pool = _miner2pool.find(minerid); + eosio_assert(itmminer2pool == _miner2pool.end(), "minerid already in a pool"); + + storepool_index _storepool(_self, _self); + auto itstorepool = _storepool.find(pool_id.value); + eosio_assert(itstorepool != _storepool.end(), "storepool not registered"); + + + maccount_index _maccount(_self, minerowner.value); + auto itmaccount = _maccount.find(minerid); + eosio_assert(itmaccount != _maccount.end(), "minerid not registered"); + + eosio_assert((itstorepool->space_left > 0 && itstorepool->space_left > itmaccount->space),"pool space not enough"); + + _miner2pool.emplace(_self, [&](auto &row) { + row.minerid = minerid; + row.pool_id = pool_id; + }); + + spoolminers_index _spoolminers(_self, pool_id.value); + _spoolminers.emplace(_self, [&](auto &row) { + row.pool_id = pool_id; + row.minerid = minerid; + row.miner_owner = minerowner; + row.space = itmaccount->space; + }); + + _storepool.modify(itstorepool, _self, [&](auto &row) { + row.space_left -= itmaccount->space; + }); } bool hddpool::is_bp_account(uint64_t uservalue) @@ -823,4 +935,4 @@ asset exchange_state::convert(asset from, symbol_type to) return from; } -EOSIO_ABI(hddpool, (getbalance)(buyhdd)(sellhdd)(sethfee)(subbalance)(addhspace)(subhspace)(newmaccount)(addmprofit)(clearall)(calcmbalance)) +EOSIO_ABI(hddpool, (getbalance)(buyhdd)(sellhdd)(sethfee)(subbalance)(addhspace)(subhspace)(newmaccount)(addmprofit)(clearall)(calcmbalance)(clsallpools)(regstrpool)(addm2pool)) diff --git a/contracts/hddpool/hddpool.hpp b/contracts/hddpool/hddpool.hpp index b4b93195a0263cc5760acbe4d6a1dc6adb34f746..bd92eefcf82b7848d1ebb79a654755b2b2902ecb 100644 --- a/contracts/hddpool/hddpool.hpp +++ b/contracts/hddpool/hddpool.hpp @@ -65,9 +65,15 @@ public: void subhspace(name user, uint64_t space, name caller); void newmaccount(name owner, uint64_t minerid, name caller); void addmprofit(name owner, uint64_t minerid, uint64_t space, name caller); - void clearall(); + void clearall(name owner); void calcmbalance(name owner, uint64_t minerid); + //store pool related actions -- start + void clsallpools(); + void regstrpool(name pool_id, name pool_owner, uint64_t max_space); + void addm2pool(uint64_t minerid, name pool_id, name minerowner); + //store pool related actions -- end + private: struct userhdd { @@ -94,6 +100,48 @@ private: }; typedef multi_index maccount_index; + struct miner2acc //scope minerid + { + uint64_t minerid; //矿机id + name owner; //拥有矿机的矿主的账户名 + uint64_t primary_key() const { return minerid; } + }; + typedef multi_index miner2acc_index; + + //store poll tables (scope : self) start ----------------- + //store pool + struct storepool + { + name pool_id; //pool id use eos name type + name pool_owner; //pool owner is a ytachain account + uint64_t max_space; //max space for this pool + uint64_t space_left; //space left for this pool + uint64_t primary_key() const { return pool_id.value; } + }; + typedef multi_index storepool_index; + + //storepool's miners ( scope : pool_id ) + struct spoolminers + { + name pool_id; //pool id use eos name type + uint64_t minerid; //矿机id + name miner_owner; //拥有矿机的矿主的账户名 + uint64_t space; //矿机的生产空间 + uint64_t primary_key() const { return minerid; } + }; + typedef multi_index spoolminers_index; + + //miner's storepool ( scope : minerid) + struct miner2pool + { + uint64_t minerid; + name pool_id; + uint64_t primary_key() const { return minerid; } + }; + typedef multi_index miner2pool_index; + //store poll tables (scope : self) end ------------------- + + struct hdd_global_state { int64_t hdd_total_balance = 10000000000;