提交 95ced3b0 编写于 作者: B Bart Wyatt

merging changes to master at 22b71a62

......@@ -69,8 +69,8 @@ ENDIF(WIN32)
FIND_PACKAGE(Boost 1.64 REQUIRED COMPONENTS
thread
date_time
system
filesystem
system
program_options
signals
serialization
......
......@@ -12,6 +12,12 @@ developing applications (smart contracts).
The public testnet described in the [wiki](https://github.com/EOSIO/eos/wiki/Testnet%3A%20Public) is running the `dawn-2.x` branch. The `master` branch is no longer compatible with the public testnet. Instructions are provided below for building either option.
### Supported Operating Systems
EOS.IO currently supports the following operating systems:
1. Ubuntu 16.04 and higher (Ubuntu 16.10 recommended).
2. MacOS Darwin 10.12 and higher (MacOS 10.13.x recommended).
3. Fedora 25 and higher (Fedora 27 recommended).
# Resources
1. [EOS.IO Website](https://eos.io)
2. [Documentation](https://eosio.github.io/eos/)
......@@ -27,10 +33,10 @@ The public testnet described in the [wiki](https://github.com/EOSIO/eos/wiki/Tes
1. [Getting Started](#gettingstarted)
2. [Setting up a build/development environment](#setup)
1. [Automated build script](#autobuild)
1. [Clean install Ubuntu 16.10 for a local testnet](#autoubuntulocal)
2. [Clean install Ubuntu 16.10 for the public testnet](#autoubuntupublic)
3. [MacOS Sierra 10.12.6 for a local testnet](#automaclocal)
4. [MacOS Sierra 10.12.6 for the public testnet](#automacpublic)
1. [Clean install Linux (Ubuntu & Fedora) for a local testnet](#autoubuntulocal)
2. [Clean install Linux (Ubuntu & Fedora) for the public testnet](#autoubuntupublic)
3. [MacOS for a local testnet](#automaclocal)
4. [MacOS for the public testnet](#automacpublic)
3. [Building EOS and running a node](#runanode)
1. [Getting the code](#getcode)
2. [Building from source code](#build)
......@@ -48,8 +54,9 @@ The public testnet described in the [wiki](https://github.com/EOSIO/eos/wiki/Tes
7. [Doxygen documentation](#doxygen)
8. [Running EOS in Docker](#docker)
9. [Manual installation of the dependencies](#manualdep)
1. [Clean install Ubuntu 16.10](#ubuntu)
2. [MacOS Sierra 10.12.6](#macos)
1. [Clean install Ubuntu 16.04 and higher](#ubuntu)
2. [MacOS Sierra 10.12 and higher](#macos)
3. [Fedora 25 and higher](#fedora)
<a name="gettingstarted"></a>
## Getting Started
......@@ -61,31 +68,34 @@ The following instructions detail the process of getting the software, building
<a name="autobuild"></a>
### Automated build script
For Ubuntu 16.10 and MacOS Sierra, there is an automated build script that can install all dependencies and builds EOS.
Supported Operating Systems:
1. Ubuntu 16.04 and higher.
2. MacOS Darwin 10.12 and higher.
3. Fedora 25 and higher.
It is called eosio-build.sh with the following inputs.
- architecture [ubuntu|darwin]
- optional mode [full|build]
For Ubuntu, MacOS and Fedora there is an automated build script that can install all dependencies and builds EOS.
We are working on supporting Centos, Amazon Linux & Red Hat in future releases.
The second optional input can be `full` or `build` where `full` implies that it installs dependencies and builds eos. If you omit this input then the build script installs dependencies and then builds eos.
It is called eosio_build.sh
```bash
./eosio-build.sh <architecture> <optional mode>
cd eos
./eosio_build.sh
```
Choose whether you will be building for a local testnet or for the public testnet and jump to the appropriate section below. Clone the EOS repository recursively as described and run eosio-build.sh located in the root `eos` folder.
Choose whether you will be building for a local testnet or for the public testnet and jump to the appropriate section below. Clone the EOS repository recursively as described and run eosio_build.sh located in the root `eos` folder.
:warning: **As of February 2018, `master` is under heavy development and is not suitable for experimentation.** :warning:
We strongly recommend following the instructions for building the public testnet version for [Ubuntu](#autoubuntupublic) or [Mac OS X](#automacpublic). `master` is in pieces on the garage floor while we rebuild this hotrod. This notice will be removed when `master` is usable again. Your patience is appreciated.
<a name="autoubuntulocal"></a>
#### :no_entry: Clean install Ubuntu 16.10 for a local testnet :no_entry:
#### :no_entry: Clean install Linux (Ubuntu & Fedora) for a local testnet :no_entry:
```bash
git clone https://github.com/eosio/eos --recursive
cd eos
./eosio-build.sh ubuntu
./eosio_build.sh
```
For ease of contract development, one further step is required:
......@@ -97,14 +107,15 @@ sudo make install
Now you can proceed to the next step - [Creating and launching a single-node testnet](#singlenode)
<a name="autoubuntupublic"></a>
#### Clean install Ubuntu 16.10 for the public testnet
#### Clean install Linux (Ubuntu & Fedora) for the public testnet
```bash
git clone https://github.com/eosio/eos --recursive
cd eos
git checkout dawn-2.x
./build.sh ubuntu
git checkout DAWN-2018-01-25
./eosio_build.sh
```
For ease of contract development, one further step is required:
......@@ -116,22 +127,18 @@ sudo make install
Now you can proceed to the next step - [Running a node on the public testnet](#publictestnet)
<a name="automaclocal"></a>
#### :no_entry: MacOS Sierra for a local testnet :no_entry:
#### :no_entry: MacOS for a local testnet :no_entry:
Before running the script make sure you have updated XCode and brew:
Before running the script make sure you have installed/updated XCode. Note: The build script
will install homebrew if it is not already installed on you system. [Homebrew Website](https://brew.sh)
```bash
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
Then clone the EOS repository recursively and run eosio-build.sh in the root `eos` folder.
Then clone the EOS repository recursively and run eosio_build.sh in the root `eos` folder.
```bash
git clone https://github.com/eosio/eos --recursive
cd eos
./eosio-build.sh darwin
./eosio_build.sh
```
For ease of contract development, one further step is required:
......@@ -143,23 +150,20 @@ make install
Now you can proceed to the next step - [Creating and launching a single-node testnet](#singlenode)
<a name="automacpublic"></a>
#### MacOS Sierra for the public testnet
Before running the script make sure you have updated XCode and brew:
#### MacOS for the public testnet
```bash
xcode-select --install
ruby -e "$(curl -fsSl https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
Before running the script make sure you have installed/updated XCode. Note: The build script
will install homebrew if it is not already installed on you system. [Homebrew Website](https://brew.sh)
Then clone the EOS repository recursively, checkout the branch that is compatible with the public testnet, and run eosio-build.sh in the root `eos` folder.
Then clone the EOS repository recursively, checkout the branch that is compatible with the public testnet, and run eosio_build.sh in the root `eos` folder.
```bash
git clone https://github.com/eosio/eos --recursive
cd eos
git checkout dawn-2.x
./build.sh darwin
git checkout DAWN-2018-01-25
./eosio_build.sh
```
For ease of contract development, one further step is required:
......@@ -199,7 +203,7 @@ cd ~
git clone https://github.com/eosio/eos --recursive
mkdir -p ~/eos/build && cd ~/eos/build
cmake -DBINARYEN_BIN=~/binaryen/bin -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib ..
make -j4
make -j$( nproc )
```
Out-of-source builds are also supported. To override clang's default choice in compiler, add these flags to the CMake command:
......@@ -557,7 +561,7 @@ Dependencies:
* Clang 4.0.0
* CMake 3.5.1
* Boost 1.64
* Boost 1.66
* OpenSSL
* LLVM 4.0
* [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git)
......@@ -578,14 +582,14 @@ sudo apt-get install clang-4.0 lldb-4.0 libclang-4.0-dev cmake make \
autoconf libtool git
```
Install Boost 1.64:
Install Boost 1.66:
```bash
cd ~
wget -c 'https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download' -O boost_1.64.0.tar.bz2
tar xjf boost_1.64.0.tar.bz2
cd boost_1_64_0/
echo "export BOOST_ROOT=$HOME/opt/boost_1_64_0" >> ~/.bash_profile
wget -c 'https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_66_0.tar.bz2/download' -O boost_1.64.0.tar.bz2
tar xjf boost_1.66.0.tar.bz2
cd boost_1_66_0/
echo "export BOOST_ROOT=$HOME/boost_1_66_0" >> ~/.bash_profile
source ~/.bash_profile
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
......@@ -636,6 +640,13 @@ cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install
```
Add `WASM_LLVM_CONFIG` and `LLVM_DIR` to your `.bash_profile`:
```bash
echo "export WASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config" >> ~/.bash_profile
echo "export LLVM_DIR=~/wasm-compiler/lib/cmake/llvm" >> ~/.bash_profile
source ~/.bash_profile
```
Your environment is set up. Now you can <a href="#runanode">build EOS and run a node</a>.
......@@ -696,7 +707,6 @@ echo "export BINARYEN_ROOT=~/binaryen" >> ~/.bash_profile
source ~/.bash_profile
```
Build LLVM and clang for WASM:
```bash
......@@ -709,13 +719,94 @@ cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install
make -j$( nproc ) install
```
Add `WASM_LLVM_CONFIG` and `LLVM_DIR` to your `.bash_profile`:
```bash
echo "export WASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config" >> ~/.bash_profile
echo "export LLVM_DIR=/usr/local/Cellar/llvm@4/4.0.1/lib/cmake/llvm/" >> ~/.bash_profile
source ~/.bash_profile
```
<a name="fedora"></a>
### Clean install Fedora 25 and higher
Install the development toolkit:
```bash
sudo yum update
sudo yum install git gcc.x86_64 gcc-c++.x86_64 autoconf automake libtool make cmake.x86_64 \
bzip2 bzip2-devel.x86_64 openssl-devel.x86_64 gmp-devel.x86_64 \
libstdc++-devel.x86_64 python3-devel.x86_64 libedit.x86_64 \
ncurses-devel.x86_64 swig.x86_64 gettext-devel.x86_64
```
Install Boost 1.66:
```bash
cd ~
curl -L https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.bz2 > boost_1.66.0.tar.bz2
tar xf boost_1.66.0.tar.bz2
echo "export BOOST_ROOT=$HOME/boost_1_66_0" >> ~/.bash_profile
source ~/.bash_profile
cd boost_1_66_0/
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
```
Install [secp256k1-zkp (Cryptonomex branch)](https://github.com/cryptonomex/secp256k1-zkp.git):
```bash
cd ~
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install
```
To use the WASM compiler, EOS has an external dependency on [binaryen](https://github.com/WebAssembly/binaryen.git):
```bash
cd ~
git clone https://github.com/WebAssembly/binaryen.git
cd ~/binaryen
git checkout tags/1.37.14
cmake . && make
```
Add `BINARYEN_ROOT` to your .bash_profile:
```bash
echo "export BINARYEN_ROOT=~/binaryen" >> ~/.bash_profile
source ~/.bash_profile
```
By default LLVM and clang do not include the WASM build target, so you will have to build it yourself:
```bash
mkdir ~/wasm-compiler
cd ~/wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=.. -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j$( nproc ) install
```
Add `WASM_LLVM_CONFIG` and `LLVM_DIR` to your `.bash_profile`:
```bash
echo "export WASM_LLVM_CONFIG=~/wasm-compiler/llvm/bin/llvm-config" >> ~/.bash_profile
echo "export LLVM_DIR=/usr/local/Cellar/llvm\@4/4.0.1/lib/cmake/llvm" >> ~/.bash_profile
echo "export LLVM_DIR=~/wasm-compiler/lib/cmake/llvm" >> ~/.bash_profile
source ~/.bash_profile
```
Your environment is set up. Now you can <a href="#runanode">build EOS and run a node</a>.
......@@ -12,6 +12,7 @@
#include <eosiolib/datastream.hpp>
#include <eosiolib/serialize.hpp>
#include <eosiolib/multi_index.hpp>
#include <eosiolib/privileged.h>
namespace eosiosystem {
......@@ -21,12 +22,15 @@ namespace eosiosystem {
static const account_name system_account = SystemAccount;
typedef eosio::generic_currency< eosio::token<system_account,S(4,EOS)> > currency;
struct total_bandwidth {
struct total_resources {
account_name owner;
typename currency::token_type total_net_weight;
typename currency::token_type total_cpu_weight;
uint32_t total_ram = 0;
uint64_t primary_key()const { return owner; }
EOSLIB_SERIALIZE( total_resources, (owner)(total_net_weight)(total_cpu_weight)(total_ram) );
};
......@@ -50,10 +54,15 @@ namespace eosiosystem {
uint64_t primary_key()const { return to; }
EOSLIB_SERIALIZE( delegated_bandwidth, (from)(to)(net_weight)(cpu_weight)
(start_pending_net_withdraw)(pending_net_withdraw)(deferred_net_withdraw_handler)
(start_pending_cpu_withdraw)(pending_cpu_withdraw)(deferred_cpu_withdraw_handler) );
};
typedef eosio::multi_index< N(totalband), total_bandwidth > total_bandwidth_index_type;
typedef eosio::multi_index< N(totalband), total_resources> total_resources_index_type;
typedef eosio::multi_index< N(delband), delegated_bandwidth> del_bandwidth_index_type;
......@@ -80,7 +89,7 @@ namespace eosiosystem {
typename currency::token_type stake_quantity;
EOSLIB_SERIALIZE( delnetbw, (delegator)(receiver)(stake_quantity) )
EOSLIB_SERIALIZE( delnetbw, (from)(receiver)(stake_quantity) )
};
ACTION( SystemAccount, undelnetbw ) {
......@@ -105,14 +114,15 @@ namespace eosiosystem {
require_auth( del.from );
del_bandwidth_index_type del_index( SystemAccount, del.from );
total_bandwidth_index_type total_index( SystemAccount, del.to );
// require_account( receiver );
total_resources_index_type total_index( SystemAccount, del.receiver );
//eosio_assert( is_account( del.receiver ), "can only delegate resources to an existing account" );
auto itr = del_index.find( del.to );
if( itr == del_index.end() ) {
auto itr = del_index.find( del.receiver);
if( itr != nullptr ) {
del_index.emplace( del.from, [&]( auto& dbo ){
dbo.from = del.from;
dbo.to = del.to;
dbo.to = del.receiver;
dbo.net_weight = del.stake_quantity;
});
}
......@@ -122,10 +132,10 @@ namespace eosiosystem {
});
}
auto tot_itr = total_index.find( del.to );
if( tot_itr == total_index.end() ) {
total_index.emplace( del.from, [&]( auto& tot ) {
tot.owner = del.to;
auto tot_itr = total_index.find( del.receiver );
if( tot_itr == nullptr ) {
tot_itr = &total_index.emplace( del.from, [&]( auto& tot ) {
tot.owner = del.receiver;
tot.total_net_weight += del.stake_quantity;
});
} else {
......@@ -134,6 +144,8 @@ namespace eosiosystem {
});
}
set_resource_limits( tot_itr->owner, tot_itr->total_ram, tot_itr->total_net_weight.quantity, tot_itr->total_cpu_weight.quantity, 0 );
currency::inline_transfer( del.from, SystemAccount, del.stake_quantity, "stake bandwidth" );
} // delnetbw
......@@ -150,7 +162,7 @@ namespace eosiosystem {
static void apply( account_name code, action_name act ) {
if( !eosio::dispatch<contract, regproducer, regproxy, nonce>( code, act) ) {
if( !eosio::dispatch<contract, regproducer, regproxy, delnetbw, nonce>( code, act) ) {
if ( !eosio::dispatch<currency, typename currency::transfer, typename currency::issue>( code, act ) ) {
eosio::print("Unexpected action: ", eosio::name(act), "\n");
eosio_assert( false, "received unexpected action");
......
......@@ -1027,6 +1027,36 @@ int32_t store_i64i64i64( account_name scope, table_name table, account_name bta,
* @return 1 if the record was updated, 0 if no record with key was found
*/
int32_t update_i64i64i64( account_name scope, table_name table, account_name bta, const void* data, uint32_t len );
///@} dbi64i64i64
int32_t db_store_i64(account_name scope, table_name table, account_name payer, uint64_t id, const void* data, uint32_t len);
void db_update_i64(int32_t iterator, account_name payer, const void* data, uint32_t len);
void db_remove_i64(int32_t iterator);
int32_t db_get_i64(int32_t iterator, const void* data, uint32_t len);
int32_t db_next_i64(int32_t iterator, uint64_t* primary);
int32_t db_previous_i64(int32_t iterator, uint64_t* primary);
int32_t db_find_i64(account_name code, account_name scope, table_name table, uint64_t id);
int32_t db_lowerbound_i64( account_name code, account_name scope, table_name table, uint64_t id);
int32_t db_upperbound_i64( account_name code, account_name scope, table_name table, uint64_t id);
int32_t db_idx64_store(account_name scope, table_name table, account_name payer, uint64_t id, const uint64_t* secondary);
void db_idx64_update(int32_t iterator, account_name payer, const uint64_t* secondary);
void db_idx64_remove(int32_t iterator);
int32_t db_idx64_next(int32_t iterator, uint64_t* primary);
int32_t db_idx64_previous(int32_t iterator, uint64_t* primary);
int32_t db_idx64_find_primary(account_name code, account_name scope, table_name table, uint64_t* secondary, uint64_t primary);
int32_t db_idx64_find_secondary(account_name code, account_name scope, table_name table, const uint64_t* secondary, uint64_t* primary);
int32_t db_idx64_lowerbound(account_name code, account_name scope, table_name table, uint64_t* secondary, uint64_t* primary);
int32_t db_idx64_upperbound(account_name code, account_name scope, table_name table, uint64_t* secondary, uint64_t* primary);
int32_t db_idx128_store(account_name scope, table_name table, account_name payer, uint64_t id, const uint128_t* secondary);
void db_idx128_update(int32_t iterator, account_name payer, const uint128_t* secondary);
void db_idx128_remove(int32_t iterator);
int32_t db_idx128_next(int32_t iterator, uint64_t* primary);
int32_t db_idx128_previous(int32_t iterator, uint64_t* primary);
int32_t db_idx128_find_primary(account_name code, account_name scope, table_name table, uint128_t* secondary, uint64_t primary);
int32_t db_idx128_find_secondary(account_name code, account_name scope, table_name table, const uint128_t* secondary, uint64_t* primary);
int32_t db_idx128_lowerbound(account_name code, account_name scope, table_name table, uint128_t* secondary, uint64_t* primary);
int32_t db_idx128_upperbound(account_name code, account_name scope, table_name table, uint128_t* secondary, uint64_t* primary);
///@} dbi64i64i64
}
......@@ -11,36 +11,9 @@
#include <eosiolib/types.hpp>
#include <eosiolib/serialize.hpp>
#include <eosiolib/datastream.hpp>
#include <eosiolib/db.h>
extern "C" {
int db_store_i64( uint64_t scope, uint64_t table, uint64_t payer, uint64_t id, char* buffer, size_t buffer_size );
void db_update_i64( int iterator, uint64_t payer, char* buffer, size_t buffer_size );
int db_find_i64( uint64_t code, uint64_t scope, uint64_t table, uint64_t id );
int db_lowerbound_i64( uint64_t code, uint64_t scope, uint64_t table, uint64_t id );
int db_get_i64( int iterator, char* buffer, size_t buffer_size );
void db_remove_i64( int iterator );
int db_next_i64( int iterator, uint64_t* pk );
int db_previous_i64( int iterator, uint64_t* pk );
int db_idx64_next( int iterator, uint64_t* primary );
int db_idx64_prev( int iterator, uint64_t* primary );
int db_idx64_find_primary( uint64_t code, uint64_t scope, uint64_t table, uint64_t* secondary, uint64_t primary );
int db_idx64_find_secondary( uint64_t code, uint64_t scope, uint64_t table, uint64_t* secondary, uint64_t* primary );
int db_idx64_lowerbound( uint64_t code, uint64_t scope, uint64_t table, uint64_t* secondary, uint64_t* primary );
int db_idx64_upperbound( uint64_t code, uint64_t scope, uint64_t table, uint64_t* secondary, uint64_t* primary );
void db_idx64_remove( int iterator );
void db_idx64_update( int iterator, uint64_t payer, const uint64_t* secondary );
int db_idx128_next( int iterator, uint64_t* primary );
int db_idx128_prev( int iterator, uint64_t* primary );
int db_idx128_find_primary( uint64_t code, uint64_t scope, uint64_t table, uint128_t* secondary, uint64_t primary );
int db_idx128_find_secondary( uint64_t code, uint64_t scope, uint64_t table, uint128_t* secondary, uint64_t* primary );
int db_idx128_lowerbound( uint64_t code, uint64_t scope, uint64_t table, uint128_t* secondary, uint64_t* primary );
int db_idx128_upperbound( uint64_t code, uint64_t scope, uint64_t table, uint128_t* secondary, uint64_t* primary );
void db_idx128_remove( int iterator );
void db_idx128_update( int iterator, uint64_t payer, const uint128_t* secondary );
}
namespace eosio {
......@@ -54,14 +27,14 @@ struct secondary_iterator;
template<>
struct secondary_iterator<uint64_t> {
static int db_idx_next( int iterator, uint64_t* primary ) { return db_idx64_next( iterator, primary ); }
static int db_idx_prev( int iterator, uint64_t* primary ) { return db_idx64_prev( iterator, primary ); }
static int db_idx_prev( int iterator, uint64_t* primary ) { return db_idx64_previous( iterator, primary ); }
static void db_idx_remove( int iterator ) { db_idx64_remove( iterator ); }
};
template<>
struct secondary_iterator<uint128_t> {
static int db_idx_next( int iterator, uint64_t* primary ) { return db_idx128_next( iterator, primary ); }
static int db_idx_prev( int iterator, uint64_t* primary ) { return db_idx128_prev( iterator, primary ); }
static int db_idx_prev( int iterator, uint64_t* primary ) { return db_idx128_previous( iterator, primary ); }
static void db_idx_remove( int iterator ) { db_idx128_remove( iterator ); }
};
......@@ -436,7 +409,6 @@ class multi_index
auto secondary_keys = boost::hana::transform( _indicies, [&]( auto& idx ) {
return idx.extract_secondary_key( obj );
});
boost::hana::at_c<0>(secondary_keys);
auto mutableobj = const_cast<T&>(obj);
updater( mutableobj );
......
#pragma once
extern "C" {
/**
* @defgroup privilegedapi Privileged API
* @ingroup systemapi
* @brief Defines an API for accessing configuration of the chain that can only be done by privileged accounts
*/
/**
* @defgroup privilegedcapi Privileged C API
* @ingroup privilegedapi
* @brief Define C Privileged API
*
* @{
*/
void set_resource_limits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight, int64_t ignored);
void set_active_producers( char *producer_data, size_t producer_data_size );
///@ } privilegedcapi
}
......@@ -39,25 +39,6 @@ extern "C" {
time now();
///@ } systemcapi
/**
* @defgroup privilegedapi Privileged API
* @ingroup systemapi
* @brief Defines an API for accessing configuration of the chain that can only be done by privileged accounts
*/
/**
* @defgroup privilegedcapi Privileged C API
* @ingroup privilegedapi
* @brief Define C Privileged API
*
* @{
*/
void set_resource_limits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight, int64_t ignored);
void set_active_producers( char *producer_data, size_t producer_data_size );
///@ } privilegedcapi
}
......@@ -7,6 +7,7 @@
#include <eosiolib/types.hpp>
#include <eosiolib/serialize.hpp>
#include <eosiolib/system.h>
#include <eosiolib/privileged.h>
using namespace eosio;
......
......@@ -17,6 +17,7 @@
//#include "test_real.cpp"
//#include "test_transaction.cpp"
//#include "test_types.cpp"
#include "test_db.cpp"
extern "C" {
......@@ -91,7 +92,14 @@ extern "C" {
// WASM_TEST_HANDLER(test_db, key_i64i64i64_under_limit);
// WASM_TEST_HANDLER(test_db, key_i64i64i64_available_space_exceed_limit);
// WASM_TEST_HANDLER(test_db, key_i64i64i64_another_under_limit);
//
WASM_TEST_HANDLER(test_db, primary_i64_general);
WASM_TEST_HANDLER(test_db, primary_i64_lowerbound);
WASM_TEST_HANDLER(test_db, primary_i64_upperbound);
WASM_TEST_HANDLER(test_db, idx64_general);
WASM_TEST_HANDLER(test_db, idx64_lowerbound);
WASM_TEST_HANDLER(test_db, idx64_upperbound);
// //test crypto
// WASM_TEST_HANDLER(test_crypto, test_sha256);
// WASM_TEST_HANDLER(test_crypto, sha256_no_data);
......
......@@ -117,6 +117,13 @@ struct test_db {
static unsigned int key_i64i64i64_under_limit();
static unsigned int key_i64i64i64_available_space_exceed_limit();
static unsigned int key_i64i64i64_another_under_limit();
static void primary_i64_general();
static void primary_i64_lowerbound();
static void primary_i64_upperbound();
static void idx64_general();
static void idx64_lowerbound();
static void idx64_upperbound();
};
struct test_crypto {
......
此差异已折叠。
#!/usr/bin/env bash
##########################################################################
# This is EOS bootstrapper script for Linux and OS X.
# This file was downloaded from https://github.com/EOSIO/eos
# Feel free to change this file to fit your needs.
##########################################################################
VERSION=1.0
ulimit -u
# Define directories.
WORK_DIR=$PWD
BUILD_DIR=${WORK_DIR}/build
TEMP_DIR=/tmp
# Target architectures
ARCH=$1
TARGET_ARCHS="ubuntu darwin"
# Check ARCH
if [[ $# > 2 ]]; then
echo ""
echo "Error: too many arguments"
exit 1
fi
if [[ $# < 1 ]]; then
echo ""
echo "Usage: bash build.sh TARGET [full|build]"
echo ""
echo "Targets: $TARGET_ARCHS"
exit 1
fi
if [[ $ARCH =~ [[:space:]] || ! $TARGET_ARCHS =~ (^|[[:space:]])$ARCH([[:space:]]|$) ]]; then
echo ""
echo ">>> WRONG ARCHITECTURE \"$ARCH\""
exit 1
fi
if [ -z "$2" ]; then
INSTALL_DEPS=1
else
if [ "$2" == "full" ]; then
INSTALL_DEPS=1
elif [ "$2" == "build" ]; then
INSTALL_DEPS=0
else
echo ">>> WRONG mode use full or build"
exit 1
fi
fi
echo ""
echo ">>> ARCHITECTURE \"$ARCH\""
if [ $ARCH == "ubuntu" ]; then
BOOST_ROOT=${HOME}/opt/boost_1_64_0
BINARYEN_BIN=${HOME}/opt/binaryen/bin
OPENSSL_ROOT_DIR=/usr/local/opt/openssl
OPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
WASM_LLVM_CONFIG=${HOME}/opt/wasm/bin/llvm-config
fi
if [ $ARCH == "darwin" ]; then
OPENSSL_ROOT_DIR=/usr/local/opt/openssl
OPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
BINARYEN_BIN=/usr/local/binaryen/bin/
WASM_LLVM_CONFIG=/usr/local/wasm/bin/llvm-config
fi
# Debug flags
COMPILE_EOS=1
COMPILE_CONTRACTS=1
# Define default arguments.
CMAKE_BUILD_TYPE=RelWithDebugInfo
# Install dependencies
if [ ${INSTALL_DEPS} == "1" ]; then
echo ">> Install dependencies"
. ${WORK_DIR}/scripts/install_dependencies.sh
fi
# Create the build dir
cd ${WORK_DIR}
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
CXX_COMPILER=clang++-4.0
C_COMPILER=clang-4.0
if [ $ARCH == "darwin" ]; then
CXX_COMPILER=clang++
C_COMPILER=clang
fi
# Build EOS
cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CXX_COMPILER} -DCMAKE_C_COMPILER=${C_COMPILER} -DWASM_LLVM_CONFIG=${WASM_LLVM_CONFIG} -DBINARYEN_BIN=${BINARYEN_BIN} -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES} ..
make -j10
#!/bin/bash
##########################################################################
# This is EOS bootstrapper script for Linux and OS X.
# This file was downloaded from https://github.com/EOSIO/eos
#
# Copyright (c) 2017, Respective Authors all rights reserved.
#
# After June 1, 2018 this software is available under the following terms:
#
# The MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# https://github.com/EOSIO/eos/blob/master/LICENSE.txt
##########################################################################
VERSION=1.1
ULIMIT=$( ulimit -u )
# Define directories.
WORK_DIR=$PWD
BUILD_DIR=${WORK_DIR}/build
TEMP_DIR=/tmp
ARCH=$(uname)
txtbld=$(tput bold)
bldred=${txtbld}$(tput setaf 1)
txtrst=$(tput sgr0)
printf "\n\tARCHITECTURE ${ARCH}\n"
if [ $ARCH == "Linux" ]; then
if [ ! -e /etc/os-release ]; then
printf "EOSIO currently supports Ubuntu, Red Hat & Fedora Linux only.\n"
printf "Please install on the latest version of one of these Linux distributions.\n"
printf "https://www.ubuntu.com/\n"
printf "https://start.fedoraproject.org/en/\n"
printf "Exiting now.\n"
exit 1
fi
OS_NAME=$( cat /etc/os-release | grep ^NAME | cut -d'=' -f2 | sed 's/\"//gI' )
case $OS_NAME in
"Ubuntu")
FILE=${WORK_DIR}/scripts/eosio_build_ubuntu.sh
CXX_COMPILER=clang++-4.0
C_COMPILER=clang-4.0
;;
"Fedora")
FILE=${WORK_DIR}/scripts/eosio_build_fedora.sh
CXX_COMPILER=g++
C_COMPILER=gcc
;;
*)
printf "\n\tUnsupported Linux Distribution. Exiting now.\n\n"
exit 1
esac
export BOOST_ROOT=${HOME}/opt/boost_1_66_0
export BINARYEN_BIN=${HOME}/opt/binaryen/bin
export OPENSSL_ROOT_DIR=/usr/include/openssl
export OPENSSL_LIBRARIES=/usr/include/openssl
export WASM_LLVM_CONFIG=${HOME}/opt/wasm/bin/llvm-config
. $FILE
fi
if [ $ARCH == "Darwin" ]; then
OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1
OPENSSL_LIBRARIES=/usr/local/opt/openssl@1.1/lib
BINARYEN_BIN=/usr/local/binaryen/bin/
WASM_LLVM_CONFIG=/usr/local/wasm/bin/llvm-config
CXX_COMPILER=clang++
C_COMPILER=clang
. scripts/eosio_build_darwin.sh
fi
printf "\n\n>>>>>>>> ALL dependencies sucessfully found or installed . Installing EOS.IO\n\n"
# Debug flags
COMPILE_EOS=1
COMPILE_CONTRACTS=1
# Define default arguments.
CMAKE_BUILD_TYPE=RelWithDebugInfo
# Create the build dir
cd ${WORK_DIR}
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
# Build EOS
cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CXX_COMPILER} \
-DCMAKE_C_COMPILER=${C_COMPILER} -DWASM_LLVM_CONFIG=${WASM_LLVM_CONFIG} \
-DBINARYEN_BIN=${BINARYEN_BIN} -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} \
-DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES} ..
if [ $? -ne 0 ]; then
printf "\n\t>>>>>>>>>>>>>>>>>>>> CMAKE building EOSIO has exited with the above error.\n\n"
exit -1
fi
make -j$(nproc) VERBOSE=1
if [ $? -ne 0 ]; then
printf "\n\t>>>>>>>>>>>>>>>>>>>> MAKE building EOSIO has exited with the above error.\n\n"
exit -1
fi
printf "\n\t>>>>>>>>>>>>>>>>>>>> EOSIO has been successfully installed.\n\n"
Subproject commit a0cf75ad7c39137ebf03b0f3b0b4e5b7f731296b
Subproject commit ef2b0c8d64f770d80ce537ec04d0de4bdc4d3585
......@@ -370,8 +370,7 @@ void apply_context::db_remove_i64( int iterator ) {
int apply_context::db_get_i64( int iterator, char* buffer, size_t buffer_size ) {
const key_value_object& obj = keyval_cache.get( iterator );
if( buffer_size >= obj.value.size() )
memcpy( buffer, obj.value.data(), obj.value.size() );
memcpy( buffer, obj.value.data(), std::min(obj.value.size(), buffer_size) );
return obj.value.size();
}
......
......@@ -131,17 +131,6 @@ namespace eosio { namespace chain { namespace contracts {
FC_ASSERT( tables.size() == abi.tables.size() );
}
void abi_serializer::append_system_abi(account_name account, abi_def& abi) {
if ( account == eosio::chain::config::system_account_name ) {
abi_def eos_abi = chain_initializer::eos_contract_abi();
abi.actions.insert(abi.actions.end(), eos_abi.actions.cbegin(), eos_abi.actions.cend());
abi.structs.insert(abi.structs.end(), eos_abi.structs.cbegin(), eos_abi.structs.cend());
abi.tables.insert(abi.tables.end(), eos_abi.tables.cbegin(), eos_abi.tables.cend());
abi.types.insert(abi.types.end(), eos_abi.types.cbegin(), eos_abi.types.cend());
}
}
bool abi_serializer::is_builtin_type(const type_name& type)const {
return built_in_types.find(type) != built_in_types.end();
}
......
......@@ -50,9 +50,9 @@ void chain_initializer::register_types(chain_controller& chain, chainbase::datab
}
abi_def chain_initializer::eos_contract_abi()
abi_def chain_initializer::eos_contract_abi(const abi_def& eosio_system_abi)
{
abi_def eos_abi;
abi_def eos_abi(eosio_system_abi);
eos_abi.types.push_back( type_def{"account_name","name"} );
eos_abi.types.push_back( type_def{"share_type","int64"} );
eos_abi.types.push_back( type_def{"onerror","bytes"} );
......
......@@ -142,10 +142,15 @@ void apply_eosio_setabi(apply_context& context) {
context.require_authorization(act.account);
// if system account append native abi
if ( act.account == eosio::chain::config::system_account_name ) {
act.abi = chain_initializer::eos_contract_abi(act.abi);
}
/// if an ABI is specified make sure it is well formed and doesn't
/// reference any undefined types
abi_serializer(act.abi).validate();
// todo: figure out abi serilization location
// todo: figure out abi serialization location
const auto& account = db.get<account_object,by_name>(act.account);
db.modify( account, [&]( auto& a ) {
......@@ -306,7 +311,7 @@ void apply_eosio_onerror(apply_context& context) {
static const abi_serializer& get_abi_serializer() {
static optional<abi_serializer> _abi_serializer;
if (!_abi_serializer) {
_abi_serializer.emplace(chain_initializer::eos_contract_abi());
_abi_serializer.emplace(chain_initializer::eos_contract_abi(abi_def()));
}
return *_abi_serializer;
......
......@@ -134,7 +134,7 @@ class apply_context {
});
}
int find_secondary( uint64_t code, uint64_t scope, uint64_t table, secondary_key_type& secondary, uint64_t& primary ) {
int find_secondary( uint64_t code, uint64_t scope, uint64_t table, const secondary_key_type& secondary, uint64_t& primary ) {
auto tab = context.find_table( context.receiver, scope, table );
if( !tab ) return -1;
......@@ -142,7 +142,6 @@ class apply_context {
if( !obj ) return -1;
primary = obj->primary_key;
secondary = obj->secondary_key;
itr_cache.cache_table( *tab );
return itr_cache.add( *obj );
......@@ -209,7 +208,6 @@ class apply_context {
primary = itr->primary_key;
return itr_cache.add(*itr);
}
int find_primary( uint64_t code, uint64_t scope, uint64_t table, secondary_key_type& secondary, uint64_t primary ) {
......
......@@ -73,12 +73,11 @@ struct abi_serializer {
}
template<typename Vec>
static bool to_abi(account_name account, const Vec& abi_vec, abi_def& abi)
static bool to_abi(const Vec& abi_vec, abi_def& abi)
{
if( !is_empty_abi(abi_vec) || account == eosio::chain::config::system_account_name ) { /// 4 == packsize of empty Abi
if( !is_empty_abi(abi_vec) ) { /// 4 == packsize of empty Abi
fc::datastream<const char*> ds( abi_vec.data(), abi_vec.size() );
fc::raw::unpack( ds, abi );
append_system_abi(account, abi);
return true;
}
return false;
......@@ -86,7 +85,6 @@ struct abi_serializer {
private:
void binary_to_variant(const type_name& type, fc::datastream<const char*>& stream, fc::mutable_variant_object& obj)const;
static void append_system_abi(account_name account, abi_def& abi);
};
namespace impl {
......
......@@ -24,7 +24,7 @@ namespace eosio { namespace chain { namespace contracts {
void prepare_database(chain::chain_controller& chain, chainbase::database& db);
static abi_def eos_contract_abi();
static abi_def eos_contract_abi(const abi_def& eosio_system_abi);
private:
genesis_state_type genesis;
......
......@@ -646,7 +646,7 @@ class database_api : public context_aware_api {
return context.db_lowerbound_i64( code, scope, table, id );
}
int db_upperbound_i64( uint64_t code, uint64_t scope, uint64_t table, uint64_t id ) {
return context.db_lowerbound_i64( code, scope, table, id );
return context.db_upperbound_i64( code, scope, table, id );
}
int db_idx64_store( uint64_t scope, uint64_t table, uint64_t payer, uint64_t id, const uint64_t& secondary ) {
......@@ -658,13 +658,12 @@ class database_api : public context_aware_api {
void db_idx64_remove( int iterator ) {
return context.idx64.remove( iterator );
}
int db_idx64_find_secondary( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t& primary ) {
int db_idx64_find_secondary( uint64_t code, uint64_t scope, uint64_t table, const uint64_t& secondary, uint64_t& primary ) {
return context.idx64.find_secondary(code, scope, table, secondary, primary);
}
int db_idx64_find_primary( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t primary ) {
return context.idx64.find_secondary(code, scope, table, secondary, primary);
return context.idx64.find_primary(code, scope, table, secondary, primary);
}
int db_idx64_lowerbound( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t& primary ) {
return context.idx64.lowerbound_secondary(code, scope, table, secondary, primary);
}
......@@ -678,22 +677,6 @@ class database_api : public context_aware_api {
return context.idx64.previous_secondary(iterator, primary);
}
/*
int db_idx64_next( int iterator, uint64_t& primary ) {
}
int db_idx64_prev( int iterator, uint64_t& primary ) {
}
int db_idx64_find_primary( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t primary ) {
}
int db_idx64_find_secondary( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t& primary ) {
}
int db_idx64_lowerbound( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t& primary ) {
}
int db_idx64_upperbound( uint64_t code, uint64_t scope, uint64_t table, uint64_t& secondary, uint64_t& primary ) {
}
*/
int db_idx128_store( uint64_t scope, uint64_t table, uint64_t payer, uint64_t id, const uint128_t& secondary ) {
return context.idx128.store( scope, table, payer, id, secondary );
}
......@@ -706,7 +689,7 @@ class database_api : public context_aware_api {
int db_idx128_find_primary( uint64_t code, uint64_t scope, uint64_t table, uint128_t& secondary, uint64_t primary ) {
return context.idx128.find_primary( code, scope, table, secondary, primary );
}
int db_idx128_find_secondary( uint64_t code, uint64_t scope, uint64_t table, uint128_t& secondary, uint64_t& primary ) {
int db_idx128_find_secondary( uint64_t code, uint64_t scope, uint64_t table, const uint128_t& secondary, uint64_t& primary ) {
return context.idx128.find_secondary(code, scope, table, secondary, primary);
}
int db_idx128_lowerbound( uint64_t code, uint64_t scope, uint64_t table, uint128_t& secondary, uint64_t& primary ) {
......
Subproject commit d48ebabf56b4115753fcabb7648a0ffcf3b0f5e9
Subproject commit 664fdd9e79263a894794f96959612ec2d1d013d0
......@@ -85,7 +85,7 @@ namespace eosio { namespace testing {
try {
const auto &accnt = control->get_database().get<account_object, by_name>(name);
contracts::abi_def abi;
if (contracts::abi_serializer::to_abi(accnt.name, accnt.abi, abi)) {
if (contracts::abi_serializer::to_abi(accnt.abi, abi)) {
return contracts::abi_serializer(abi);
}
return optional<contracts::abi_serializer>();
......
......@@ -413,7 +413,7 @@ fc::variant account_history_plugin_impl::transaction_to_variant(const packed_tra
const auto* accnt = database.find<chain::account_object,chain::by_name>( name );
if (accnt != nullptr) {
abi_def abi;
if (abi_serializer::to_abi(accnt->name, accnt->abi, abi)) {
if (abi_serializer::to_abi(accnt->abi, abi)) {
return abi_serializer(abi);
}
}
......
......@@ -284,7 +284,7 @@ abi_def get_abi( const chain_controller& db, const name& account ) {
const auto& code_accnt = d.get<account_object,by_name>( account );
abi_def abi;
abi_serializer::to_abi(code_accnt.name, code_accnt.abi, abi);
abi_serializer::to_abi(code_accnt.abi, abi);
return abi;
}
......@@ -365,7 +365,7 @@ struct resolver_factory {
const auto *accnt = api->db.get_database().template find<account_object, by_name>(name);
if (accnt != nullptr) {
abi_def abi;
if (abi_serializer::to_abi(accnt->name, accnt->abi, abi)) {
if (abi_serializer::to_abi(accnt->abi, abi)) {
return abi_serializer(abi);
}
}
......@@ -450,7 +450,7 @@ read_only::get_code_results read_only::get_code( const get_code_params& params )
}
abi_def abi;
if( abi_serializer::to_abi(accnt.name, accnt.abi, abi) ) {
if( abi_serializer::to_abi(accnt.abi, abi) ) {
result.abi = std::move(abi);
}
......@@ -492,7 +492,7 @@ read_only::abi_json_to_bin_result read_only::abi_json_to_bin( const read_only::a
abi_json_to_bin_result result;
const auto& code_account = db.get_database().get<account_object,by_name>( params.code );
abi_def abi;
if( abi_serializer::to_abi(code_account.name, code_account.abi, abi) ) {
if( abi_serializer::to_abi(code_account.abi, abi) ) {
abi_serializer abis( abi );
result.binargs = abis.variant_to_binary( abis.get_action_type( params.action ), params.args );
}
......@@ -503,7 +503,7 @@ read_only::abi_bin_to_json_result read_only::abi_bin_to_json( const read_only::a
abi_bin_to_json_result result;
const auto& code_account = db.get_database().get<account_object,by_name>( params.code );
abi_def abi;
if( abi_serializer::to_abi(code_account.name, code_account.abi, abi) ) {
if( abi_serializer::to_abi(code_account.abi, abi) ) {
abi_serializer abis( abi );
result.args = abis.binary_to_variant( abis.get_action_type( params.action ), params.binargs );
}
......
......@@ -73,7 +73,6 @@ public:
void consum_blocks();
bool is_scope_relevant(const vector<account_name>& scope);
void update_account(const chain::action& msg);
static const account_name newaccount;
......@@ -90,8 +89,6 @@ public:
static const std::string accounts_col;
};
abi_def mongo_db_plugin_impl::eos_abi;
const account_name mongo_db_plugin_impl::newaccount = "newaccount";
const account_name mongo_db_plugin_impl::transfer = "transfer";
const account_name mongo_db_plugin_impl::lock = "lock";
......@@ -181,14 +178,13 @@ namespace {
{
using bsoncxx::builder::basic::kvp;
try {
auto from_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(from_account.view()["abi"].get_document())).as<abi_def>();
abi_serializer abis;
if (msg.account == chain::config::system_account_name) {
abis.set_abi(mongo_db_plugin_impl::eos_abi);
} else {
auto from_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(from_account.view()["abi"].get_document())).as<abi_def>();
abis.set_abi(abi);
abi = chain::contracts::chain_initializer::eos_contract_abi(abi);
}
abis.set_abi(abi);
auto v = abis.binary_to_variant(abis.get_action_type(msg.name), msg.data);
auto json = fc::json::to_string(v);
try {
......@@ -264,15 +260,10 @@ void mongo_db_plugin_impl::_process_irreversible_block(const signed_block& block
auto block_num = block.block_num();
if (processed == 0) {
if (startup) {
if (wipe_database_on_startup) {
// verify on start we have no previous blocks
verify_no_blocks(blocks);
FC_ASSERT(block_num < 2, "Expected start of block, instead received block_num: ${bn}", ("bn", block_num));
// Currently we are creating a 'fake' block in chain_controller::initialize_chain() since initial accounts
// and producers are not written to the block log. If this is the fake block, indicate it as block_num 0.
if (block_num == 1 && block.producer == chain::config::system_account_name) {
block_num = 0;
}
} else {
// verify on restart we have previous block
verify_last_block(blocks, prev_block_id_str);
......@@ -403,17 +394,22 @@ void mongo_db_plugin_impl::update_account(const chain::action& msg) {
if (msg.name == transfer) {
auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::microseconds{fc::time_point::now().time_since_epoch().count()});
/* todo need to follow eosio.system transfer
auto transfer = msg.as<chain::contracts::transfer>();
auto from_name = transfer.from.to_string();
auto to_name = transfer.to.to_string();
auto from_account = find_account(accounts, transfer.from);
auto to_account = find_account(accounts, transfer.to);
abi_serializer abis;
auto eosio_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(eosio_account.view()["abi"].get_document())).as<abi_def>();
abis.set_abi(abi);
auto transfer = abis.binary_to_variant(abis.get_action_type(msg.name), msg.data);
auto from_name = transfer["from"].as<name>().to_string();
auto to_name = transfer["to"].as<name>().to_string();
auto from_account = find_account(accounts, from_name);
auto to_account = find_account(accounts, to_name);
asset from_balance = asset::from_string(from_account.view()["eos_balance"].get_utf8().value.to_string());
asset to_balance = asset::from_string(to_account.view()["eos_balance"].get_utf8().value.to_string());
from_balance -= asset(chain::share_type(transfer.amount));
to_balance += asset(chain::share_type(transfer.amount));
auto asset_quantity = transfer["quantity"].as<asset>();
from_balance -= asset_quantity;
to_balance += asset_quantity;
document update_from{};
update_from << "$set" << open_document << "eos_balance" << from_balance.to_string()
......@@ -426,7 +422,7 @@ void mongo_db_plugin_impl::update_account(const chain::action& msg) {
accounts.update_one(document{} << "_id" << from_account.view()["_id"].get_oid() << finalize, update_from.view());
accounts.update_one(document{} << "_id" << to_account.view()["_id"].get_oid() << finalize, update_to.view());
*/
} else if (msg.name == newaccount) {
auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::microseconds{fc::time_point::now().time_since_epoch().count()});
......@@ -496,8 +492,6 @@ void mongo_db_plugin_impl::init() {
// Create the native contract accounts manually; sadly, we can't run their contracts to make them create themselves
// See native_contract_chain_initializer::prepare_database()
eos_abi = chain::contracts::chain_initializer::eos_contract_abi();
accounts = mongo_conn[db_name][accounts_col]; // Accounts
bsoncxx::builder::stream::document doc{};
if (accounts.count(doc.view()) == 0) {
......@@ -507,7 +501,6 @@ void mongo_db_plugin_impl::init() {
<< "eos_balance" << asset(chain::config::initial_token_supply).to_string()
<< "staked_balance" << asset().to_string()
<< "unstaking_balance" << asset().to_string()
<< "abi" << bsoncxx::from_json(fc::json::to_string(eos_abi))
<< "createdAt" << b_date{now}
<< "updatedAt" << b_date{now};
......
......@@ -54,8 +54,8 @@ Usage: ./eosc create account [OPTIONS] creator name OwnerKey ActiveKey
Positionals:
creator TEXT The name of the account creating the new account
name TEXT The name of the new account
OwnerKey TEXT The owner public key for the account
ActiveKey TEXT The active public key for the account
OwnerKey TEXT The owner public key for the new account
ActiveKey TEXT The active public key for the new account
Options:
-s,--skip-signature Specify that unlocked wallet keys should not be used to sign transaction
......@@ -458,8 +458,8 @@ int main( int argc, char** argv ) {
auto createAccount = create->add_subcommand("account", localized("Create a new account on the blockchain"), false);
createAccount->add_option("creator", creator, localized("The name of the account creating the new account"))->required();
createAccount->add_option("name", account_name, localized("The name of the new account"))->required();
createAccount->add_option("OwnerKey", owner_key_str, localized("The owner public key for the account"))->required();
createAccount->add_option("ActiveKey", active_key_str, localized("The active public key for the account"))->required();
createAccount->add_option("OwnerKey", owner_key_str, localized("The owner public key for the new account"))->required();
createAccount->add_option("ActiveKey", active_key_str, localized("The active public key for the new account"))->required();
createAccount->add_flag("-s,--skip-signature", skip_sign, localized("Specify that unlocked wallet keys should not be used to sign transaction"));
add_standard_transaction_options(createAccount);
createAccount->set_callback([&] {
......
OS_VER=`sw_vers -productVersion`
OS_MAJ=`echo "${OS_VER}" | cut -d'.' -f1`
OS_MIN=`echo "${OS_VER}" | cut -d'.' -f2`
OS_PATCH=`echo "${OS_VER}" | cut -d'.' -f3`
MEM_GIG=`bc <<< "($(sysctl -in hw.memsize) / 1024000000)"`
CPU_SPEED=`bc <<< "scale=2; ($(sysctl -in hw.cpufrequency) / 100000000) / 10"`
CPU_CORE=$( sysctl -in machdep.cpu.core_count )
DISK_TOTAL=`df -H $PWD | grep /dev | tr -s ' ' | cut -d\ -f2 | sed 's/[^0-9]//'`
DISK_AVAIL=`df -H $PWD | grep /dev | tr -s ' ' | cut -d\ -f4 | sed 's/[^0-9]//'`
printf "\n\tOS name: $ARCH\n"
printf "\tOS Version: ${OS_VER}\n"
printf "\tCPU speed: ${CPU_SPEED}Ghz\n"
printf "\tCPU cores: $CPU_CORE\n"
printf "\tPhysical Memory: $MEM_GIG Gbytes\n"
printf "\tDisk space total: ${DISK_TOTAL}G\n"
printf "\tDisk space available: ${DISK_AVAIL}G\n\n"
if [ $MEM_GIG -lt 8 ]; then
printf "\tYour system must have 8 or more Gigabytes of physical memory installed.\n"
printf "\tExiting now.\n"
exit 1
fi
if [ $OS_MIN -lt 12 ]; then
printf "\tYou must be running Mac OS 10.12.x or higher to install EOSIO.\n"
printf "\tExiting now.\n"
exit 1
fi
if [ $DISK_AVAIL -lt 100 ]; then
printf "\tYou must have at least 100GB of available storage to install EOSIO.\n"
printf "\tExiting now.\n"
exit 1
fi
process_dep()
{
printf "\tChecking XCode installation\n"
XCODESELECT=$(which xcode-select)
if [ $? -ne 0 ]; then
printf "\n\tXCode must be installed in order to proceed.\n\n"
printf "\texiting now.\n"
exit 1
fi
printf "\tXCode installation found.\n\n"
printf "\tChecking Ruby installation\n"
RUBY=$(which ruby)
if [ $? -ne 0 ]; then
printf "\nRuby must be installed in order to proceed.\n\n"
printf "\texiting now.\n"
exit 1
fi
printf "\tRuby installation found.\n\n"
printf "\tChecking Home Brew installation\n"
BREW=$(which brew)
if [ $? -ne 0 ]; then
printf "\tHomebrew must be installed to compile EOS.IO\n\n"
printf "\tDo you wish to install Home Brew?\n"
select yn in "Yes" "No"; do
case $yn in
[Yy]* )
$XCODESELECT --install 2>/dev/null;
$RUBY -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
if [ $? -ne 0 ]; then
echo "User aborted homebrew installation. Exiting now."
exit 0;
fi
break;;
[Nn]* ) echo "User aborted homebrew installation. Exiting now.";
exit;;
* ) echo "Please enter 1 for yes or 2 for no.";;
esac
done
fi
printf "\tHome Brew installation found.\n\n"
# DEPS="git automake libtool openssl cmake wget boost llvm@4 gmp gettext"
DCOUNT=0
COUNT=1
PERMISSION_GETTEXT=0
DISPLAY=""
DEP=""
printf "\tChecking dependencies.\n"
for line in `cat ${WORK_DIR}/scripts/eosio_build_dep`; do
pkg=$( echo "${line}" | cut -d',' -f1 )
printf "\tChecking $pkg ... "
BIN=$(which $pkg)
if [ $? -eq 0 ]; then
printf "\t$pkg found\n"
continue
fi
LIB=$( ls -l /usr/local/lib/lib${pkg}* 2>/dev/null | wc -l)
if [ ${LIB} -ne 0 ]; then
printf "\t$pkg found\n"
continue
else
let DCOUNT++
if [ $pkg = "LLVM" ]; then
pkg="llvm@4"
fi
if [ $pkg = "gettext" ]; then
PERMISSION_GETTEXT=1
fi
DEP=$DEP" ${pkg} "
DISPLAY="${DISPLAY}${COUNT}. ${pkg}\n\t"
printf "\tPackage ${pkg} ${bldred}NOT${txtrst} found.\n"
let COUNT++
fi
done
if [ $DCOUNT -ne 0 ]; then
printf "\n\tThe following dependencies are required to install EOSIO.\n"
printf "\n\t$DISPLAY\n\n"
echo "Do you wish to install these packages?"
select yn in "Yes" "No"; do
case $yn in
[Yy]* )
if [ $PERMISSION_GETTEXT -eq 1 ]; then
sudo chown -R $(whoami) /usr/local/share
fi
$XCODESELECT --install 2>/dev/null;
printf "\tUpdating Home Brew.\n"
brew update
printf "\tInstalling Dependencies.\n"
brew install --force $DEP
brew unlink $DEP && brew link --force $DEP
break;;
[Nn]* ) echo "User aborting installation of required dependencies, Exiting now."; exit;;
* ) echo "Please type 1 for yes or 2 for no.";;
esac
done
else
printf "\n\tNo required Home Brew dependencies to install.\n"
fi
return 0
}
process_dep
printf "\n\tChecking for secp256k1-zkp\n"
# install secp256k1-zkp (Cryptonomex branch)
if [ ! -e /usr/local/lib/libsecp256k1.a ]; then
cd ${TEMP_DIR}
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
if [ $? -ne 0 ]; then
printf "\tError running autogen\n"
printf "\tExiting now.\n\n"
exit;
fi
./configure
make
if [ $? -ne 0 ]; then
printf "\tError compiling secp256k1-zkp.\n"
printf "\tExiting now.\n\n"
exit;
fi
sudo make install
sudo rm -rf ${TEMP_DIR}/secp256k1-zkp
else
printf "\tsecp256k1 found at /usr/local/lib/\n"
fi
printf "\n\tChecking for binaryen\n"
if [ ! -e /usr/local/binaryen/bin/binaryen.js ]; then
cd ${TEMP_DIR}
git clone https://github.com/WebAssembly/binaryen
cd binaryen
git checkout tags/1.37.14
cmake . && make
if [ $? -ne 0 ]; then
printf "\tError compiling binaryen.\n"
printf "\tExiting now.\n\n"
exit;
fi
sudo mkdir /usr/local/binaryen
sudo mv ${TEMP_DIR}/binaryen/bin /usr/local/binaryen
sudo ln -s /usr/local/binaryen/bin/* /usr/local
sudo rm -rf ${TEMP_DIR}/binaryen
else
printf "\tBinaryen found at /usr/local/binaryen/bin/\n"
fi
printf "\n\tChecking for WASM\n"
if [ ! -d /usr/local/wasm/bin ]; then
# Build LLVM and clang for WASM:
cd ${TEMP_DIR}
mkdir wasm-compiler
cd wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
sudo cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/wasm \
-DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly \
-DCMAKE_BUILD_TYPE=Release ../
if [ $? -ne 0 ]; then
printf "\tError compiling WASM.\n"
printf "\tExiting now.\n\n"
exit;
fi
sudo make -j4 install
sudo rm -rf ${TEMP_DIR}/wasm-compiler
else
printf "\tWASM found at /usr/local/wasm/bin/\n"
fi
\ No newline at end of file
automake,http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
libtool,http://gnu.askapache.com/libtool/libtool-2.4.6.tar.gz
openssl,https://www.openssl.org/source/openssl-1.0.2n.tar.gz
LLVM,http://releases.llvm.org/5.0.1/llvm-5.0.1.src.tar.xz
wget,https://ftp.gnu.org/gnu/wget/wget-1.19.2.tar.gz
cmake,https://cmake.org/files/v3.10/cmake-3.10.1-Darwin-x86_64.tar.gz
boost,https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
gmp,https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2
gettext,https://ftp.gnu.org/pub/gnu/gettext/gettext-latest.tar.gz
\ No newline at end of file
OS_VER=$( cat /etc/os-release | grep VERSION_ID | cut -d'=' -f2 | sed 's/[^0-9\.]//gI' )
MEM_MEG=$( free -m | grep Mem | tr -s ' ' | cut -d\ -f2 )
CPU_SPEED=$( lscpu | grep "MHz" | tr -s ' ' | cut -d\ -f3 | cut -d'.' -f1 )
CPU_CORE=$( lscpu | grep "^CPU(s)" | tr -s ' ' | cut -d\ -f2 )
DISK_TOTAL=`df -h / | grep /dev | tr -s ' ' | cut -d\ -f2 | sed 's/[^0-9]//'`
DISK_AVAIL=`df -h / | grep /dev | tr -s ' ' | cut -d\ -f4 | sed 's/[^0-9]//'`
printf "\n\tOS name: $OS_NAME\n"
printf "\tOS Version: ${OS_VER}\n"
printf "\tCPU speed: ${CPU_SPEED}Mhz\n"
printf "\tCPU cores: $CPU_CORE\n"
printf "\tPhysical Memory: $MEM_MEG Mgb\n"
printf "\tDisk space total: ${DISK_TOTAL}G\n"
printf "\tDisk space available: ${DISK_AVAIL}G\n"
if [ $MEM_MEG -lt 4000 ]; then
echo "Your system must have 8 or more Gigabytes of physical memory installed."
echo "exiting now."
exit 1
fi
if [ $OS_VER -lt 25 ]; then
echo "You must be running Fedora 25 or higher to install EOSIO."
echo "exiting now"
exit 1
fi
if [ $DISK_AVAIL -lt 100 ]; then
echo "You must have at least 100GB of available storage to install EOSIO."
echo "exiting now"
exit 1
fi
printf "\n\tChecking Yum installation\n"
YUM=$( which yum 2>/dev/null )
if [ $? -ne 0 ]; then
printf "\n\tYum must be installed to compile EOS.IO.\n"
printf "\n\tExiting now.\n"
exit 0
fi
printf "\tYum installation found at ${YUM}.\n"
printf "\tUpdating YUM.\n"
UPDATE=$( sudo yum update )
if [ $? -ne 0 ]; then
printf "\n\tYUM update failed.\n"
printf "\n\tExiting now.\n"
exit 1
fi
printf "\t${UPDATE}\n"
DEP_ARRAY=( git gcc.x86_64 gcc-c++.x86_64 autoconf automake libtool make cmake.x86_64 bzip2 bzip2-devel.x86_64 openssl-devel.x86_64 gmp.x86_64 gmp-devel.x86_64 libstdc++-devel.x86_64 python3-devel.x86_64 libedit.x86_64 ncurses-devel.x86_64 swig.x86_64 )
DCOUNT=0
COUNT=1
DISPLAY=""
DEP=""
printf "\n\tChecking YUM for installed dependencies.\n\n"
for (( i=0; i<${#DEP_ARRAY[@]}; i++ ));
do
pkg=$( sudo $YUM info ${DEP_ARRAY[$i]} 2>/dev/null | grep Repo | tr -s ' ' | cut -d: -f2 | sed 's/ //g' )
if [ "$pkg" != "@System" ]; then
DEP=$DEP" ${DEP_ARRAY[$i]} "
DISPLAY="${DISPLAY}${COUNT}. ${DEP_ARRAY[$i]}\n\t"
printf "\tPackage ${DEP_ARRAY[$i]} ${bldred} NOT ${txtrst} found.\n"
let COUNT++
let DCOUNT++
else
printf "\tPackage ${DEP_ARRAY[$i]} found.\n"
continue
fi
done
if [ ${DCOUNT} -ne 0 ]; then
printf "\n\tThe following dependencies are required to install EOSIO.\n"
printf "\n\t$DISPLAY\n\n"
printf "\tDo you wish to install these dependencies?\n"
select yn in "Yes" "No"; do
case $yn in
[Yy]* )
printf "\n\n\tInstalling dependencies\n\n"
sudo yum -y install ${DEP}
if [ $? -ne 0 ]; then
printf "\n\tYUM dependency installation failed.\n"
printf "\n\tExiting now.\n"
exit 1
else
printf "\n\tYUM dependencies installed successfully.\n"
fi
break;;
[Nn]* ) echo "User aborting installation of required dependencies, Exiting now."; exit;;
* ) echo "Please type 1 for yes or 2 for no.";;
esac
done
else
printf "\n\tNo required YUM dependencies to install.\n"
fi
printf "\n\tChecking for boost libraries\n"
if [ ! -d ${HOME}/opt/boost_1_66_0 ]; then
# install boost
printf "\tInstalling boost libraries\n"
cd ${TEMP_DIR}
curl -L https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.bz2 > boost_1.66.0.tar.bz2
tar xf boost_1.66.0.tar.bz2
cd boost_1_66_0/
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
rm -rf ${TEMP_DIR}/boost_1_66_0/
rm -f ${TEMP_DIR}/boost_1.66.0.tar.bz2
else
printf "\tBoost 1.66 found at ${HOME}/opt/boost_1_66_0\n"
fi
printf "\n\tChecking for secp256k1-zkp\n"
# install secp256k1-zkp (Cryptonomex branch)
if [ ! -e /usr/local/lib/libsecp256k1.a ]; then
printf "\tInstalling secp256k1-zkp (Cryptonomex branch)\n"
cd ${TEMP_DIR}
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
if [ $? -ne 0 ]; then
printf "\tError running autogen for secp256k1-zkp.\n"
printf "\tExiting now.\n\n"
exit;
fi
./configure
make
if [ $? -ne 0 ]; then
printf "\tError compiling secp256k1-zkp.\n"
printf "\tExiting now.\n\n"
exit;
fi
sudo make install
rm -rf cd ${TEMP_DIR}/secp256k1-zkp
else
printf "\tsecp256k1 found\n"
fi
printf "\n\tChecking for binaryen\n"
if [ ! -d ${HOME}/opt/binaryen ]; then
# Install binaryen v1.37.14:
printf "\tInstalling binaryen v1.37.14:\n"
cd ${TEMP_DIR}
git clone https://github.com/WebAssembly/binaryen
cd binaryen
git checkout tags/1.37.14
cmake . && make
if [ $? -ne 0 ]; then
printf "\tError compiling binaryen.\n"
printf "\tExiting now.\n\n"
exit;
fi
mkdir -p ${HOME}/opt/binaryen/ 2>/dev/null
mv ${TEMP_DIR}/binaryen/bin ${HOME}/opt/binaryen/
rm -rf ${TEMP_DIR}/binaryen
else
printf "\tBinaryen found at ${HOME}/opt/binaryen\n"
fi
printf "\n\tChecking for LLVM with WASM support.\n"
if [ ! -d ${HOME}/opt/wasm/bin ]; then
# Build LLVM and clang with EXPERIMENTAL WASM support:
printf "\tInstalling LLVM & WASM\n"
cd ${TEMP_DIR}
mkdir llvm-compiler 2>/dev/null
cd llvm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${HOME}/opt/wasm -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
if [ $? -ne 0 ]; then
printf "\tError compiling LLVM and clang with EXPERIMENTAL WASM support.\n"
printf "\tExiting now.\n\n"
exit;
fi
make -j$(nproc)
if [ $? -ne 0 ]; then
printf "\tError compiling LLVM and clang with EXPERIMENTAL WASM support.\n"
printf "\tExiting now.\n\n"
exit;
fi
make install
rm -rf ${TEMP_DIR}/llvm-compiler 2>/dev/null
else
printf "\tWASM found at ${HOME}/opt/wasm\n"
fi
\ No newline at end of file
OS_VER=$( cat /etc/os-release | grep VERSION_ID | cut -d'=' -f2 | sed 's/[^0-9\.]//gI' )
OS_MAJ=`echo "${OS_VER}" | cut -d'.' -f1`
OS_MIN=`echo "${OS_VER}" | cut -d'.' -f2`
MEM_MEG=$( free -m | grep Mem | tr -s ' ' | cut -d\ -f2 )
CPU_SPEED=$( lscpu | grep "MHz" | tr -s ' ' | cut -d\ -f3 | cut -d'.' -f1 )
CPU_CORE=$( lscpu | grep "^CPU(s)" | tr -s ' ' | cut -d\ -f2 )
DISK_TOTAL=`df -h / | grep /dev | tr -s ' ' | cut -d\ -f2 | sed 's/[^0-9]//'`
DISK_AVAIL=`df -h / | grep /dev | tr -s ' ' | cut -d\ -f4 | sed 's/[^0-9]//'`
printf "\n\tOS name: $OS_NAME\n"
printf "\tOS Version: ${OS_VER}\n"
printf "\tCPU speed: ${CPU_SPEED}Mhz\n"
printf "\tCPU cores: $CPU_CORE\n"
printf "\tPhysical Memory: $MEM_MEG Mgb\n"
printf "\tDisk space total: ${DISK_TOTAL}G\n"
printf "\tDisk space available: ${DISK_AVAIL}G\n"
if [ $MEM_MEG -lt 4000 ]; then
echo "Your system must have 8 or more Gigabytes of physical memory installed."
echo "exiting now."
exit 1
fi
if [ $OS_MIN -lt 4 ]; then
echo "You must be running Ubuntu 16.04.x or higher to install EOSIO."
echo "exiting now"
exit 1
fi
if [ $DISK_AVAIL -lt 100 ]; then
echo "You must have at least 100GB of available storage to install EOSIO."
echo "exiting now"
exit 1
fi
DEP_ARRAY=(clang-4.0 lldb-4.0 libclang-4.0-dev cmake make libbz2-dev libssl-dev libgmp3-dev autotools-dev build-essential libbz2-dev libicu-dev python-dev autoconf libtool curl)
DCOUNT=0
COUNT=1
DISPLAY=""
DEP=""
printf "\n\tChecking for installed dependencies.\n\n"
for (( i=0; i<${#DEP_ARRAY[@]}; i++ ));
do
pkg=$( dpkg -s ${DEP_ARRAY[$i]} 2>/dev/null | grep Status | tr -s ' ' | cut -d\ -f4 )
if [ -z "$pkg" ]; then
DEP=$DEP" ${DEP_ARRAY[$i]} "
DISPLAY="${DISPLAY}${COUNT}. ${DEP_ARRAY[$i]}\n\t"
printf "\tPackage ${DEP_ARRAY[$i]} ${bldred} NOT ${txtrst} found.\n"
let COUNT++
let DCOUNT++
else
printf "\tPackage ${DEP_ARRAY[$i]} found.\n"
continue
fi
done
if [ ${DCOUNT} -ne 0 ]; then
printf "\n\tThe following dependencies are required to install EOSIO.\n"
printf "\n\t$DISPLAY\n\n"
printf "\tDo you wish to install these packages?\n"
select yn in "Yes" "No"; do
case $yn in
[Yy]* )
printf "\n\n\tInstalling dependencies\n\n"
sudo apt-get update
sudo apt-get -y install ${DEP}
if [ $? -ne 0 ]; then
printf "\n\tDPKG dependency failed.\n"
printf "\n\tExiting now.\n"
exit 1
else
printf "\n\tDPKG dependencies installed successfully.\n"
fi
break;;
[Nn]* ) echo "User aborting installation of required dependencies, Exiting now."; exit;;
* ) echo "Please type 1 for yes or 2 for no.";;
esac
done
else
printf "\n\tNo required dpkg dependencies to install.\n"
fi
printf "\n\tChecking for boost libraries\n"
if [ ! -d ${HOME}/opt/boost_1_66_0 ]; then
# install boost
printf "\tInstalling boost libraries\n"
cd ${TEMP_DIR}
curl -L https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.bz2 > boost_1.66.0.tar.bz2
tar xf boost_1.66.0.tar.bz2
cd boost_1_66_0/
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
rm -rf ${TEMP_DIR}/boost_1_66_0/
rm -f ${TEMP_DIR}/boost_1.66.0.tar.bz2
else
printf "\tBoost 1.66 found at ${HOME}/opt/boost_1_66_0\n"
fi
printf "\n\tChecking for secp256k1-zkp\n"
# install secp256k1-zkp (Cryptonomex branch)
if [ ! -e /usr/local/lib/libsecp256k1.a ]; then
printf "\tInstalling secp256k1-zkp (Cryptonomex branch)\n"
cd ${TEMP_DIR}
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
if [ $? -ne 0 ]; then
printf "\tError running autogen for secp256k1-zkp.\n"
printf "\tExiting now.\n\n"
exit;
fi
./configure
make
if [ $? -ne 0 ]; then
printf "\tError compiling secp256k1-zkp.\n"
printf "\tExiting now.\n\n"
exit;
fi
sudo make install
rm -rf cd ${TEMP_DIR}/secp256k1-zkp
else
printf "\tsecp256k1 found\n"
fi
printf "\n\tChecking for binaryen\n"
if [ ! -d ${HOME}/opt/binaryen ]; then
# Install binaryen v1.37.14:
printf "\tInstalling binaryen v1.37.14:\n"
cd ${TEMP_DIR}
git clone https://github.com/WebAssembly/binaryen
cd binaryen
git checkout tags/1.37.14
cmake . && make
if [ $? -ne 0 ]; then
printf "\tError compiling binaryen.\n"
printf "\tExiting now.\n\n"
exit;
fi
mkdir -p ${HOME}/opt/binaryen/ 2>/dev/null
mv ${TEMP_DIR}/binaryen/bin ${HOME}/opt/binaryen/
rm -rf ${TEMP_DIR}/binaryen
else
printf "\tBinaryen found at ${HOME}/opt/binaryen\n"
fi
printf "\n\tChecking for LLVM with WASM support.\n"
if [ ! -d ${HOME}/opt/wasm/bin ]; then
# Build LLVM and clang for WASM:
printf "\tInstalling LLVM & WASM\n"
cd ${TEMP_DIR}
mkdir llvm-compiler 2>/dev/null
cd llvm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${HOME}/opt/wasm -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
if [ $? -ne 0 ]; then
printf "\tError compiling LLVM and clang with EXPERIMENTAL WASM support.\n"
printf "\tExiting now.\n\n"
exit;
fi
make -j$(nproc)
if [ $? -ne 0 ]; then
printf "\tError compiling LLVM and clang with EXPERIMENTAL WASM support.\n"
printf "\tExiting now.\n\n"
exit;
fi
rm -rf ${TEMP_DIR}/llvm-compiler
else
printf "\tWASM found at ${HOME}/opt/wasm/bin\n"
fi
\ No newline at end of file
# Install dependencies script
if [ $ARCH == "ubuntu" ]; then
# install dev toolkit
sudo apt-get update
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
sudo apt-get -y install clang-4.0 lldb-4.0 libclang-4.0-dev cmake make \
libbz2-dev libssl-dev libgmp3-dev \
autotools-dev build-essential \
libbz2-dev libicu-dev python-dev \
autoconf libtool git curl automake
OPENSSL_ROOT_DIR=/usr/local/opt/openssl
OPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
# install boost
cd ${TEMP_DIR}
export BOOST_ROOT=${HOME}/opt/boost_1_64_0
curl -L https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2 > boost_1.64.0.tar.bz2
tar xvf boost_1.64.0.tar.bz2
cd boost_1_64_0/
./bootstrap.sh "--prefix=$BOOST_ROOT"
./b2 install
rm -rf ${TEMP_DIR}/boost_1_64_0/
# install secp256k1-zkp (Cryptonomex branch)
cd ${TEMP_DIR}
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install
rm -rf cd ${TEMP_DIR}/secp256k1-zkp
# install binaryen
cd ${TEMP_DIR}
git clone https://github.com/WebAssembly/binaryen
cd binaryen
git checkout tags/1.37.14
cmake . && make
mkdir -p ${HOME}/opt/binaryen/
mv ${TEMP_DIR}/binaryen/bin ${HOME}/opt/binaryen/
rm -rf ${TEMP_DIR}/binaryen
BINARYEN_BIN=${HOME}/opt/binaryen/bin
# build llvm with wasm build target:
cd ${TEMP_DIR}
mkdir wasm-compiler
cd wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=${HOME}/opt/wasm -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
make -j4 install
rm -rf ${TEMP_DIR}/wasm-compiler
WASM_LLVM_CONFIG=${HOME}/opt/wasm/bin/llvm-config
fi
if [ $ARCH == "darwin" ]; then
DEPS="git automake libtool boost openssl llvm@4 gmp wget cmake gettext"
brew update
brew install --force $DEPS
brew unlink $DEPS && brew link --force $DEPS
# LLVM_DIR=/usr/local/Cellar/llvm/4.0.1/lib/cmake/llvm
# install secp256k1-zkp (Cryptonomex branch)
cd ${TEMP_DIR}
git clone https://github.com/cryptonomex/secp256k1-zkp.git
cd secp256k1-zkp
./autogen.sh
./configure
make
sudo make install
sudo rm -rf ${TEMP_DIR}/secp256k1-zkp
# Install binaryen v1.37.14:
cd ${TEMP_DIR}
git clone https://github.com/WebAssembly/binaryen
cd binaryen
git checkout tags/1.37.14
cmake . && make
sudo mkdir /usr/local/binaryen
sudo mv ${TEMP_DIR}/binaryen/bin /usr/local/binaryen
sudo ln -s /usr/local/binaryen/bin/* /usr/local
sudo rm -rf ${TEMP_DIR}/binaryen
BINARYEN_BIN=/usr/local/binaryen/bin/
# Build LLVM and clang for WASM:
cd ${TEMP_DIR}
mkdir wasm-compiler
cd wasm-compiler
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git
cd ..
mkdir build
cd build
sudo cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/wasm -DLLVM_TARGETS_TO_BUILD= -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../
sudo make -j4 install
sudo rm -rf ${TEMP_DIR}/wasm-compiler
WASM_LLVM_CONFIG=/usr/local/wasm/bin/llvm-config
fi
......@@ -74,13 +74,14 @@ add_test(chain_test chain_test --report_level=detailed)
add_test(NAME eosiod_run_test COMMAND tests/eosiod_run_test.py -v --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test(NAME eosiod_run_remote_test COMMAND tests/eosiod_run_remote_test.py --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test(NAME p2p_dawn515_test COMMAND tests/p2p_tests/dawn_515/test.sh WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
if(BUILD_MONGO_DB_PLUGIN)
add_test(NAME eosiod_run_test-mongodb COMMAND tests/eosiod_run_test.py --mongodb --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
endif()
# TODO: Tests removed until working again on master.
# TODO: add_test(NAME p2p_sync_test COMMAND tests/p2p_tests/sync/test.sh WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME p2p_sync_test_p2_d10 COMMAND tests/p2p_tests/sync/test.sh -p 2 -d 10 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME message_storm COMMAND tests/p2p_tests/sync/test.sh -m -p 21 -n 21 -d 5 -l WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: if(BUILD_MONGO_DB_PLUGIN)
# TODO: add_test(NAME eosiod_run_test-mongodb COMMAND tests/eosiod_run_test.py --mongodb --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: endif()
# TODO: add_test(NAME trans_sync_across_mixed_cluster_test COMMAND tests/trans_sync_across_mixed_cluster_test.sh -p 1 -n 2 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME distributed-transactions-test COMMAND tests/distributed-transactions-test.py -p 1 -n 4 --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME distributed-transactions-remote-test COMMAND tests/distributed-transactions-remote-test.py --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
......
......@@ -14,10 +14,8 @@ import re
###############################################################
Print=testUtils.Utils.Print
errorExit=testUtils.Utils.errorExit
def errorExit(msg="", raw=False, errorCode=1):
Print("ERROR:" if not raw else "", msg)
exit(errorCode)
def cmdError(name, code=0, exitNow=False):
msg="FAILURE - %s%s" % (name, ("" if code == 0 else (" returned error code %d" % code)))
......@@ -374,7 +372,8 @@ try:
amountVal=int(decimal.Decimal(amountVal.split()[0])*10000)
else:
typeVal= transaction["name"]
amountVal=transaction["data"]["amount"]
amountVal=transaction["data"]["quantity"]
amountVal=int(decimal.Decimal(amountVal.split()[0])*10000)
else:
if not enableMongo:
typeVal= transaction["transaction"]["messages"][0]["type"]
......@@ -582,7 +581,7 @@ try:
for blockNum in range(1, currentBlockNum+1):
block=node.getBlock(blockNum, retry=False)
if block is None:
cmdError("% get block" % (ClientName))
cmdError("%s get block" % (ClientName))
errorExit("mongo get block by num %d" % blockNum)
if enableMongo:
......
......@@ -81,6 +81,11 @@ class Utils:
return chainSyncStrategies
@staticmethod
def errorExit(msg="", raw=False, errorCode=1):
Utils.Print("ERROR:" if not raw else "", msg)
exit(errorCode)
###########################################################################################
class Table(object):
def __init__(self, name):
......@@ -405,7 +410,7 @@ class Node(object):
Utils.Print("Publish eosio.system contract")
trans=self.publishContract(eosio.name, wastFile, abiFile, waitForTransBlock=True)
if trans is None:
errorExit("Failed to publish oesio.system.")
Utils.errorExit("Failed to publish oesio.system.")
Utils.Print("push issue action to eosio contract")
contract=eosio.name
......@@ -511,7 +516,7 @@ class Node(object):
for i in range(2):
ret=self.getEosAccountFromDb(account.name)
if ret is not None:
account_name=ret["account_name"]
account_name=ret["name"]
if account_name is None:
Utils.Print("ERROR: Failed to verify account creation.", account.name)
return None
......@@ -1112,7 +1117,7 @@ class Cluster(object):
cmdArr.append("--plugin eosio::wallet_api_plugin")
if self.enableMongo:
if Utils.amINoon:
cmdArr.append("--plugin eosio::mongo_db_plugin --mongodb-uri %s" % self.mongoUri)
cmdArr.append("--plugin eosio::mongo_db_plugin --resync --mongodb-uri %s" % self.mongoUri)
else:
cmdArr.append("--plugin eosio::db_plugin --mongodb-uri %s" % self.mongoUri)
......@@ -1294,7 +1299,7 @@ class Cluster(object):
for account in accounts:
Utils.Print("Importing keys for account %s into wallet %s." % (account.name, wallet.name))
if not self.walletMgr.importKey(account, wallet):
errorExit("Failed to import key for account %s" % (account.name))
Utils.errorExit("Failed to import key for account %s" % (account.name))
return False
self.accounts=accounts
......
......@@ -1536,7 +1536,7 @@ BOOST_AUTO_TEST_CASE(abi_cycle)
BOOST_AUTO_TEST_CASE(linkauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1568,7 +1568,7 @@ BOOST_AUTO_TEST_CASE(linkauth)
BOOST_AUTO_TEST_CASE(unlinkauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1597,7 +1597,7 @@ BOOST_AUTO_TEST_CASE(unlinkauth)
BOOST_AUTO_TEST_CASE(updateauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1664,7 +1664,7 @@ BOOST_AUTO_TEST_CASE(updateauth)
BOOST_AUTO_TEST_CASE(deleteauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1690,7 +1690,7 @@ BOOST_AUTO_TEST_CASE(deleteauth)
BOOST_AUTO_TEST_CASE(newaccount)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1834,7 +1834,7 @@ BOOST_AUTO_TEST_CASE(newaccount)
BOOST_AUTO_TEST_CASE(setcode)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -1865,7 +1865,7 @@ BOOST_AUTO_TEST_CASE(setcode)
BOOST_AUTO_TEST_CASE(setabi)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2028,7 +2028,7 @@ BOOST_AUTO_TEST_CASE(setabi)
BOOST_AUTO_TEST_CASE(postrecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2078,7 +2078,7 @@ BOOST_AUTO_TEST_CASE(postrecovery)
BOOST_AUTO_TEST_CASE(passrecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2100,7 +2100,7 @@ BOOST_AUTO_TEST_CASE(passrecovery)
BOOST_AUTO_TEST_CASE(vetorecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......
......@@ -38,12 +38,12 @@ public:
const auto& accnt = control->get_database().get<account_object,by_name>( N(identity) );
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_ser.set_abi(abi);
const auto& acnt_test = control->get_database().get<account_object,by_name>( N(identitytest) );
abi_def abi_test;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, acnt_test.abi, abi_test), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(acnt_test.abi, abi_test), true);
abi_ser_test.set_abi(abi_test);
const global_property_object &gpo = control->get_global_properties();
......
......@@ -190,7 +190,7 @@ BOOST_FIXTURE_TEST_CASE( abi_from_variant, tester ) try {
try {
const auto& accnt = this->control->get_database().get<account_object,by_name>( name );
abi_def abi;
if (abi_serializer::to_abi(accnt.name, accnt.abi, abi)) {
if (abi_serializer::to_abi(accnt.abi, abi)) {
return abi_serializer(abi);
}
return optional<abi_serializer>();
......@@ -364,7 +364,7 @@ BOOST_FIXTURE_TEST_CASE( stl_test, tester ) try {
const auto& accnt = control->get_database().get<account_object,by_name>( N(stltest) );
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
//send message
......@@ -582,7 +582,7 @@ BOOST_FIXTURE_TEST_CASE(noop, tester) try {
set_abi(N(noop), noop_abi);
const auto& accnt = control->get_database().get<account_object,by_name>(N(noop));
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
{
......@@ -647,7 +647,7 @@ BOOST_FIXTURE_TEST_CASE(eosio_abi, tester) try {
const auto& accnt = control->get_database().get<account_object,by_name>(config::system_account_name);
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
abi_ser.validate();
......@@ -830,5 +830,96 @@ BOOST_FIXTURE_TEST_CASE( check_table_maximum, tester ) try {
} FC_LOG_AND_RETHROW()
#endif
BOOST_FIXTURE_TEST_CASE( test_db, tester ) try {
produce_blocks(2);
create_accounts( {N(tester)} );
produce_block();
set_code(N(tester), test_api_wast);
// set_code(N(tester), test_api_abi);
produce_blocks(1);
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "primary_i64_general")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "primary_i64_lowerbound")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "primary_i64_upperbound")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "idx64_general")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "idx64_lowerbound")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
{
signed_transaction trx;
trx.actions.emplace_back(vector<permission_level>{{N(tester), config::active_name}},
test_api_action<TEST_METHOD("test_db", "idx64_upperbound")> {});
set_tapos(trx);
trx.sign(get_private_key(N(tester), "active"), chain_id_type());
push_transaction(trx);
produce_block();
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
}
} FC_LOG_AND_RETHROW() /// test_db
BOOST_AUTO_TEST_SUITE_END()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册