Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
Merge pull request #668 from EOSIO/add-preactivate-intrinsics
Browse files Browse the repository at this point in the history
add support for preactivate_feature, is_feature_activated, and get_sender intrinsics; move definition of new set_proposed_producers function
  • Loading branch information
larryk85 authored Sep 18, 2019
2 parents 3c2d2b6 + b528a65 commit eecf9a9
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 37 deletions.
11 changes: 9 additions & 2 deletions libraries/eosiolib/capi/eosio/privileged.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once

#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -105,7 +105,14 @@ void set_blockchain_parameters_packed( char* data, uint32_t datalen );
__attribute__((eosio_wasm_import))
uint32_t get_blockchain_parameters_packed( char* data, uint32_t datalen );

/**
* Pre-activate protocol feature
*
* @param feature_digest - digest of the protocol feature to pre-activate
*/
__attribute__((eosio_wasm_import))
void preactivate_feature( const capi_checksum256* feature_digest );

#ifdef __cplusplus
}
#endif

17 changes: 17 additions & 0 deletions libraries/eosiolib/capi/eosio/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,23 @@ void eosio_exit( int32_t code );
__attribute__((eosio_wasm_import))
uint64_t current_time();

/**
* Check if specified protocol feature has been activated
*
* @param feature_digest - digest of the protocol feature
* @return true if the specified protocol feature has been activated, false otherwise
*/
__attribute__((eosio_wasm_import))
bool is_feature_activated( const capi_checksum256* feature_digest );

/**
* Return name of account that sent current inline action
*
* @return name of account that sent the current inline action (empty name if not called from inline action)
*/
__attribute__((eosio_wasm_import))
capi_name get_sender();

#ifdef __cplusplus
}
#endif
Expand Down
52 changes: 39 additions & 13 deletions libraries/eosiolib/contracts/eosio/privileged.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include "producer_schedule.hpp"
#include "system.hpp"
#include "../../core/eosio/crypto.hpp"
#include "../../core/eosio/name.hpp"
#include "../../core/eosio/serialize.hpp"
Expand All @@ -11,23 +12,29 @@ namespace eosio {
__attribute__((eosio_wasm_import))
bool is_privileged( uint64_t account );

__attribute__((eosio_wasm_import))
void get_resource_limits( uint64_t account, int64_t* ram_bytes, int64_t* net_weight, int64_t* cpu_weight );
__attribute__((eosio_wasm_import))
void get_resource_limits( uint64_t account, int64_t* ram_bytes, int64_t* net_weight, int64_t* cpu_weight );

__attribute__((eosio_wasm_import))
void set_resource_limits( uint64_t account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight );

__attribute__((eosio_wasm_import))
void set_privileged( uint64_t account, bool is_priv );

__attribute__((eosio_wasm_import))
void set_resource_limits( uint64_t account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight );
__attribute__((eosio_wasm_import))
void set_blockchain_parameters_packed( char* data, uint32_t datalen );

__attribute__((eosio_wasm_import))
void set_privileged( uint64_t account, bool is_priv );
__attribute__((eosio_wasm_import))
uint32_t get_blockchain_parameters_packed( char* data, uint32_t datalen );

__attribute__((eosio_wasm_import))
void set_blockchain_parameters_packed( char* data, uint32_t datalen );
__attribute((eosio_wasm_import))
int64_t set_proposed_producers( char*, uint32_t );

__attribute__((eosio_wasm_import))
uint32_t get_blockchain_parameters_packed( char* data, uint32_t datalen );
__attribute__((eosio_wasm_import))
void preactivate_feature( const capi_checksum256* feature_digest );

__attribute((eosio_wasm_import))
int64_t set_proposed_producers( char*, uint32_t );
__attribute__((eosio_wasm_import))
int64_t set_proposed_producers_ex( uint64_t producer_data_format, char *producer_data, uint32_t producer_data_size );
}
}

Expand Down Expand Up @@ -221,7 +228,13 @@ namespace eosio {
*
* @return an optional value of the version of the new proposed schedule if successful
*/
std::optional<uint64_t> set_proposed_producers( const std::vector<producer_authority>& prods );
inline std::optional<uint64_t> set_proposed_producers( const std::vector<producer_authority>& prods ) {
auto packed_prods = eosio::pack( prods );
int64_t ret = internal_use_do_not_use::set_proposed_producers_ex(1, (char*)packed_prods.data(), packed_prods.size());
if (ret >= 0)
return static_cast<uint64_t>(ret);
return {};
}

/**
* Check if an account is privileged
Expand All @@ -246,4 +259,17 @@ namespace eosio {
internal_use_do_not_use::set_privileged( account.value, is_priv );
}

/**
* Pre-activate protocol feature
*
* @ingroup privileged
* @param feature_digest - digest of the protocol feature to pre-activate
*/
inline void preactivate_feature( const checksum256& feature_digest ) {
auto feature_digest_data = feature_digest.extract_as_byte_array();
internal_use_do_not_use::preactivate_feature(
reinterpret_cast<const internal_use_do_not_use::capi_checksum256*>( feature_digest_data.data() )
);
}

}
37 changes: 37 additions & 0 deletions libraries/eosiolib/contracts/eosio/system.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,24 @@
#pragma once
#include "../../core/eosio/time.hpp"
#include "../../core/eosio/check.hpp"
#include "../../core/eosio/fixed_bytes.hpp"
#include "../../core/eosio/name.hpp"

namespace eosio {
namespace internal_use_do_not_use {
extern "C" {
__attribute__((eosio_wasm_import, noreturn))
void eosio_exit( int32_t code );

struct __attribute__((aligned (16))) capi_checksum256 {
uint8_t hash[32];
};

__attribute__((eosio_wasm_import))
bool is_feature_activated( const capi_checksum256* feature_digest );

__attribute__((eosio_wasm_import))
uint64_t get_sender();
}
}

Expand Down Expand Up @@ -53,4 +65,29 @@ namespace eosio {
* @return time in microseconds from 1970 of the current block as a block_timestamp
*/
block_timestamp current_block_time();


/**
* Check if specified protocol feature has been activated
*
* @ingroup system
* @param feature_digest - digest of the protocol feature
* @return true if the specified protocol feature has been activated, false otherwise
*/
inline bool is_feature_activated( const checksum256& feature_digest ) {
auto feature_digest_data = feature_digest.extract_as_byte_array();
return internal_use_do_not_use::is_feature_activated(
reinterpret_cast<const internal_use_do_not_use::capi_checksum256*>( feature_digest_data.data() )
);
}

/**
* Return name of account that sent current inline action
*
* @ingroup system
* @return name of account that sent the current inline action (empty name if not called from inline action)
*/
inline name get_sender() {
return name( internal_use_do_not_use::get_sender() );
}
}
10 changes: 0 additions & 10 deletions libraries/eosiolib/eosiolib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ namespace eosio {
__attribute__((eosio_wasm_import))
int64_t set_proposed_producers( char *producer_data, uint32_t producer_data_size );
__attribute__((eosio_wasm_import))
int64_t set_proposed_producers_ex( uint64_t producer_data_format, char *producer_data, uint32_t producer_data_size );
__attribute__((eosio_wasm_import))
uint32_t get_active_producers(uint64_t*, uint32_t);
}

Expand Down Expand Up @@ -45,14 +43,6 @@ namespace eosio {
return {};
}

std::optional<uint64_t> set_proposed_producers( const std::vector<producer_authority>& prods ) {
auto packed_prods = eosio::pack( prods );
int64_t ret = set_proposed_producers_ex(1, (char*)packed_prods.data(), packed_prods.size());
if (ret >= 0)
return static_cast<uint64_t>(ret);
return {};
}

// system.hpp
time_point current_time_point() {
static auto ct = time_point(microseconds(static_cast<int64_t>(current_time())));
Expand Down
23 changes: 16 additions & 7 deletions libraries/native/intrinsics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ extern "C" {
void set_privileged( capi_name account, bool is_priv ) {
return intrinsics::get().call<intrinsics::set_privileged>(account, is_priv);
}
bool is_feature_activated( const capi_checksum256* feature_digest ) {
return intrinsics::get().call<intrinsics::is_feature_activated>(feature_digest);
}
void preactivate_feature( const capi_checksum256* feature_digest ) {
return intrinsics::get().call<intrinsics::preactivate_feature>(feature_digest);
}
uint32_t get_active_producers( capi_name* producers, uint32_t datalen ) {
return intrinsics::get().call<intrinsics::get_active_producers>(producers, datalen);
}
Expand Down Expand Up @@ -334,6 +340,9 @@ extern "C" {
int get_context_free_data( uint32_t index, char* buff, size_t size ) {
return intrinsics::get().call<intrinsics::get_context_free_data>(index, buff, size);
}
capi_name get_sender() {
return intrinsics::get().call<intrinsics::get_sender>();
}

// softfloat
static constexpr uint32_t inv_float_eps = 0x4B000000;
Expand Down Expand Up @@ -788,15 +797,15 @@ extern "C" {
void printui(uint64_t value) {
return intrinsics::get().call<intrinsics::printui>(value);
}

void printi128(const int128_t* value) {
return intrinsics::get().call<intrinsics::printi128>(value);
}

void printui128(const uint128_t* value) {
return intrinsics::get().call<intrinsics::printui128>(value);
}

void printsf(float value) {
return intrinsics::get().call<intrinsics::printsf>(value);
}
Expand All @@ -808,11 +817,11 @@ extern "C" {
void printqf(const long double* value) {
return intrinsics::get().call<intrinsics::printqf>(value);
}

void printn(uint64_t nm) {
return intrinsics::get().call<intrinsics::printn>(nm);
}

void printhex(const void* data, uint32_t len) {
return intrinsics::get().call<intrinsics::printhex>(data, len);
}
Expand Down Expand Up @@ -844,7 +853,7 @@ extern "C" {
dest[i] = tmp_buf[i];
return (void*)dest;
}

void eosio_assert(uint32_t test, const char* msg) {
if (test == 0) {
_prints(msg, eosio::cdt::output_stream_kind::std_err);
Expand All @@ -870,9 +879,9 @@ extern "C" {
longjmp(*___env_ptr, 1);
}
}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Winvalid-noreturn"
#pragma clang diagnostic ignored "-Winvalid-noreturn"
void abort() {
eosio_assert(false, "abort");
}
Expand Down
13 changes: 8 additions & 5 deletions libraries/native/native/eosio/intrinsics_def.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ namespace eosio { namespace native {
auto get_args(R(Args...)) {
return std::tuple<std::decay_t<Args>...>{};
}

template <typename R, typename Args, size_t... Is>
auto create_function(std::index_sequence<Is...>) {
return std::function<R(typename std::tuple_element<Is, Args>::type ...)>{
[](typename std::tuple_element<Is, Args>::type ...) {
return std::function<R(typename std::tuple_element<Is, Args>::type ...)>{
[](typename std::tuple_element<Is, Args>::type ...) {
eosio_assert(false, "unsupported intrinsic"); return (R)0;
}
};
}
}

#define INTRINSICS(intrinsic_macro) \
intrinsic_macro(get_resource_limits) \
Expand All @@ -48,6 +48,8 @@ intrinsic_macro(get_blockchain_parameters_packed) \
intrinsic_macro(set_blockchain_parameters_packed) \
intrinsic_macro(is_privileged) \
intrinsic_macro(set_privileged) \
intrinsic_macro(is_feature_activated) \
intrinsic_macro(preactivate_feature) \
intrinsic_macro(get_active_producers) \
intrinsic_macro(db_idx64_store) \
intrinsic_macro(db_idx64_remove) \
Expand Down Expand Up @@ -154,7 +156,8 @@ intrinsic_macro(send_inline) \
intrinsic_macro(send_context_free_inline) \
intrinsic_macro(send_deferred) \
intrinsic_macro(cancel_deferred) \
intrinsic_macro(get_context_free_data)
intrinsic_macro(get_context_free_data) \
intrinsic_macro(get_sender)

#define CREATE_ENUM(name) \
name,
Expand Down

0 comments on commit eecf9a9

Please sign in to comment.