提交 265afceb 编写于 作者: W Wang Zhi

add storepool concept

上级 7e8dc29b
......@@ -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",
......
......@@ -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))
......@@ -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<N(maccount), maccount> maccount_index;
struct miner2acc //scope minerid
{
uint64_t minerid; //矿机id
name owner; //拥有矿机的矿主的账户名
uint64_t primary_key() const { return minerid; }
};
typedef multi_index<N(miner2acc), miner2acc> 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<N(storepool), storepool> 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<N(spoolminers), spoolminers> 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<N(miner2pool), miner2pool> miner2pool_index;
//store poll tables (scope : self) end -------------------
struct hdd_global_state
{
int64_t hdd_total_balance = 10000000000;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册