eosiolib
Partitioning
In eosio.cdt
v1.6.0, eosiolib
will now be partitioned into 3 groups. These allow for finer grained allowance for particular modes of compilation.
- CAPI
- Contracts
- Core
- The
CAPI
will only be available to contract writers usingeosio-cc
and purely forC
smart contracts. - The
Contracts
will be available toeosio-cpp
for smart contract writing. Core
will be available toeosio-cpp
for any of the modes (present and future).eosio-cpp
infnative
mode will have access to all of these groups.
To access these new partitioned header files, use <eosio/header_file.hpp>
instead of <eosiolib/header_file.hpp>
. Please note that all the old header files are still available at the old eosiolib
directory, but these are deprecated and will be removed in v1.7.0. Also, once you change one header file from eosiolib
to eosio
you will need to do so for all other occurrences at that point, because of some conflicts with the auto generated dispatcher.
eosiolib C API
action.h
chain.h
crypto.h
db.h
permission.h
print.h
privileged.h
system.h
transaction.h
types.h
This entire API is now only available to C developers (i.e. using eosio-cc
), and all internal uses in Core
and Contracts
have been guarded behind the namespace eosio::internal_use_do_not_use
.
eosiolib Contracts API
-
action.hpp
-
added C++ wrappers for
publication_time
->time_point publication_time()
current_receiver
->name current_receiver()
read_action_data
->uint32_t read_action_data(void* msg, uint32_t len)
action_data_size
->uint32_t action_data_size()
-
-
contract.hpp
- renamed
receiver
toself
- renamed
code
tofirst_receiver
- moved
CONTRACT
,ACTION
andTABLE
macros here. - added
get_first_receiver()
- deprecated
get_code()
instead useget_first_receiver
- renamed
-
dispatcher.hpp
- no changes
-
eosio.hpp
- removed
CONTRACT
,ACTION
andTABLE
macros from here.
- removed
-
multi_index.hpp
- no changes
-
permission.hpp
-
added C++ wrappers for
check_transaction_authorization
check_permission_authorization
get_permission_last_used
get_account_creation_time
-
-
privileged.hpp
-
added C++ wrappers for
get_resource_limits
set_resource_limits
set_proposed_producers
is_privileged
set_privileged
-
-
producer_schedule.hpp
- moved
producer_key
struct here. - added C++ wrapper for
get_active_producers
- moved
-
singleton.hpp
- no changes
-
system.hpp
- removed
check
functions from here. -
added C++ wrappers for
eosio_exit
current_time_point
current_block_time
- removed
-
transaction.hpp
-
added C++ wrappers for
send_deferred
cancel_deferred
transaction_size
tapos_block_num
tapos_block_prefix
expiration
get_context_free_data
-
eosiolib Core API
-
asset.hpp
- no changes
-
binary_extension.hpp
- moved
datastream
operators here.
- moved
-
check.hpp
- new file
- moved
check
functions to here.
-
crypto.hpp
- moved
datastream
operators here.
- moved
-
datastream.hpp
-
removed
datastream
operators from here forsymbol
ignore
ignore_wrapper
public_key
signature
fixed_bytes
-
-
fixed_bytes.hpp
- moved
datastream
operators here.
- moved
-
ignore.hpp
- moved
datastream
operators here.
- moved
-
name.hpp
- added
print
method
- added
-
print.hpp
- added C++ wrappers
printhex
andprintl
(which replacesprints_l
) - removed explicit
print
overloads foreosio::symbol_code
,eosio::fixed_bytes<T>
from here.
- added C++ wrappers
-
rope.hpp
- new file
- houses a thin data structure for fast string concatenations.
-
serialize.hpp
- no changes
-
symbol.hpp
- moved
datastream
operators here.
- moved
-
time.hpp
- no changes
-
varint.hpp
- no changes
Auto Code Generation
There is no more need to add the EOSIO_DISPATCH
macro to your smart contracts. The compiler/linker will now automatically generate a dispatcher for you the proper eosio::contract
, eosio::action
and eosio::on_notify
attributes are used. Of course, if you don't have these attributes then you will still need to either use the old macro or hand write the apply
function yourself.
How the auto dispatcher will work
Given that you have marked your classes with the eosio::contract
macro and any sub-contracts with the macro with the same given name (i.e. eosio::contract("<contract name>")
) then any actions and notify handlers that are contained within these will be dispatchable by your smart contract. This will allow for aggregate patterns for smart contract development and better separation of concerns.
In addition to actions and notification handlers, two new "hooks" are available.
bool pre_dispatch(name self, name first_receiver, name action)
void post_dispatch(name self, name first_receiver, name action)
The pre_dispatch
hook will fire when the dispatcher is run and allow the smart contract to do some pre-validation and exit early if need be by returning false. If the function returns true then the dispatcher continues to dispatching the actions or notification handlers.
The post_dispatch
hook will only fire when the dispatcher has failed to match any notification handlers, this allows the user to do some meaningful last ditch validation.
If the dispatcher fails to find a suitable action to dispatch, then the new pattern is to fail assert with an error code. This will keep your smart contracts from being used as a sink by other users by accident (they inputted the wrong action name). This will give them clear direction at that point that the action they tried doesn't exist on your contract.
If the dispatcher is in notification handling mode and if your contract receives an eosio::onerror
notification, then the contract will assert with an error code. You can circumvent this check if you explicitly supply an error handler for it ([[eosio::on_notify("eosio::onerror")]]).
For a real world example of this new style of contract in use see tests/unit/test_contracts/simple_test.cpp
.
License