Skip to content

Commit 3a5deca

Browse files
Feature/storage power actor 2 (#112)
Signed-off-by: Alexey-N-Chernyshov <[email protected]>
1 parent e9938ae commit 3a5deca

24 files changed

+922
-128
lines changed

core/adt/balance_table_hamt.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ namespace fc::adt {
7676
const TokenAmount &floor);
7777

7878
/**
79-
* Removes from table
79+
* Removes from table and returnes previous balance
8080
* @param key addrss
81-
* @return error in case of failure
81+
* @return previous balance or error in case of failure
8282
*/
83-
outcome::result<void> remove(const Address &key);
83+
outcome::result<TokenAmount> remove(const Address &key);
8484

8585
/**
8686
* HAMT CID of root

core/adt/impl/balance_table_hamt.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ fc::outcome::result<TokenAmount> BalanceTableHamt::subtractWithMinimum(
5151
return sub;
5252
}
5353

54-
fc::outcome::result<void> BalanceTableHamt::remove(const Address &key) {
54+
fc::outcome::result<TokenAmount> BalanceTableHamt::remove(const Address &key) {
55+
OUTCOME_TRY(old_balance, hamt_.getCbor<TokenAmount>(encodeToByteString(key)));
5556
OUTCOME_TRY(hamt_.remove(encodeToByteString(key)));
5657
OUTCOME_TRY(new_root, hamt_.flush());
5758
root = new_root;
58-
return fc::outcome::success();
59+
return std::move(old_balance);
5960
}

core/power/impl/power_table_impl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ namespace fc::power {
5656
PowerTableImpl::getMiners() const {
5757
std::vector<primitives::address::Address> result;
5858
result.reserve(power_table_.size());
59-
for (auto &elem : power_table_) {
59+
for (const auto &elem : power_table_) {
6060
OUTCOME_TRY(miner_addr,
6161
primitives::address::decodeFromString(elem.first));
6262
result.push_back(miner_addr);

core/primitives/types.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ namespace fc::primitives {
3131
DealWeight deal_weight;
3232
};
3333

34+
using StoragePower = primitives::BigInt;
35+
3436
CBOR_TUPLE(SectorStorageWeightDesc, sector_size, duration, deal_weight)
3537
} // namespace fc::primitives
3638

core/vm/actor/actor.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ namespace fc::vm::actor {
110110
/** Check if actor code can represent external signing parties */
111111
bool isSignableActor(const CodeId &code);
112112

113+
/** Reserved method number for send operation */
114+
constexpr MethodNumber kSendMethodNumber{0};
115+
116+
/** Reserved method number for constructor */
117+
constexpr MethodNumber kConstructorMethodNumber{1};
118+
113119
extern const CID kEmptyObjectCid;
114120

115121
extern const CodeId kAccountCodeCid, kCronCodeCid, kStoragePowerCodeCid,

core/vm/actor/actor_method.hpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
const Actor &actor, Runtime &runtime, const MethodParams &params)
1818

1919
namespace fc::vm::actor {
20+
21+
using common::Buffer;
2022
using runtime::InvocationOutput;
2123
using runtime::Runtime;
2224

@@ -33,12 +35,6 @@ namespace fc::vm::actor {
3335
/// Actor methods exported by number
3436
using ActorExports = std::map<MethodNumber, ActorMethod>;
3537

36-
/// Reserved method number for send operation
37-
constexpr MethodNumber kSendMethodNumber{0};
38-
39-
/// Reserved method number for constructor
40-
constexpr MethodNumber kConstructorMethodNumber{1};
41-
4238
/// Decode actor params, raises appropriate error
4339
template <typename T>
4440
outcome::result<T> decodeActorParams(MethodParams params_bytes) {
@@ -50,6 +46,20 @@ namespace fc::vm::actor {
5046
}
5147

5248
using runtime::encodeActorParams;
49+
50+
template <typename T>
51+
outcome::result<T> decodeActorReturn(const InvocationOutput &result) {
52+
OUTCOME_TRY(decoded,
53+
codec::cbor::decode<T>(result.return_value.toVector()));
54+
return std::move(decoded);
55+
}
56+
57+
template <typename T>
58+
outcome::result<InvocationOutput> encodeActorReturn(const T &result) {
59+
OUTCOME_TRY(encoded, codec::cbor::encode(result));
60+
return InvocationOutput{Buffer{encoded}};
61+
}
62+
5363
} // namespace fc::vm::actor
5464

5565
#endif // CPP_FILECOIN_CORE_VM_ACTOR_ACTOR_METHOD_HPP

core/vm/actor/builtin/init/init_actor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ namespace fc::vm::actor::builtin::init {
4545
kConstructorMethodNumber,
4646
exec_params.params,
4747
message.value));
48+
ExecReturn exec_return{id_address, actor_address};
49+
OUTCOME_TRY(output, encodeActorReturn(exec_return));
4850
OUTCOME_TRY(runtime.commitState(init_actor));
49-
return InvocationOutput{Buffer{primitives::address::encode(id_address)}};
51+
return std::move(output);
5052
}
5153

5254
const ActorExports exports{{kExecMethodNumber, ActorMethod(exec)}};

core/vm/actor/builtin/init/init_actor.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,20 @@ namespace fc::vm::actor::builtin::init {
3333
MethodParams params;
3434
};
3535

36+
struct ExecReturn {
37+
Address id_address; // The canonical ID-based address for the actor
38+
Address robust_address; // A more expensive but re-org-safe address for the
39+
// newly created actor
40+
};
41+
3642
ACTOR_METHOD(exec);
3743

3844
extern const ActorExports exports;
3945

4046
CBOR_TUPLE(ExecParams, code, params)
47+
48+
CBOR_TUPLE(ExecReturn, id_address, robust_address)
49+
4150
} // namespace fc::vm::actor::builtin::init
4251

4352
#endif // CPP_FILECOIN_CORE_VM_ACTOR_INIT_ACTOR_HPP

core/vm/actor/builtin/miner/miner_actor.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "vm/actor/builtin/miner/types.hpp"
1414

1515
namespace fc::vm::actor::builtin::miner {
16+
1617
constexpr MethodNumber kGetControlAddressesMethodNumber{2};
1718
constexpr MethodNumber kChangeWorkerAddressMethodNumber{3};
1819
constexpr MethodNumber kChangePeerIdMethodNumber{4};
@@ -52,6 +53,7 @@ namespace fc::vm::actor::builtin::miner {
5253
ACTOR_METHOD(onDeferredCronEvent);
5354

5455
extern const ActorExports exports;
56+
5557
} // namespace fc::vm::actor::builtin::miner
5658

5759
#endif // CPP_FILECOIN_CORE_VM_ACTOR_BUILTIN_MINER_MINER_ACTOR_HPP

core/vm/actor/builtin/reward/reward_actor.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,15 @@ namespace fc::vm::actor::builtin::reward {
6060

6161
// Actor related stuff
6262

63+
/**
64+
* The network works purely in the indivisible token amounts. This constant
65+
* converts to a fixed decimal with more human-friendly scale.
66+
*/
6367
static const BigInt kTokenPrecision{1e18};
68+
69+
/**
70+
* Target reward released to each block winner
71+
*/
6472
static const BigInt kBlockRewardTarget{1e20};
6573

6674
static constexpr auto kRewardVestingFunction{VestingFunction::NONE};

0 commit comments

Comments
 (0)