Can this be done without starting a nodeos instance? Perhaps with a js or cleos command?
I am asking since I want to be able to identify the chain_id for private blockchains without starting a nodeos just for this.
The chain id is the is the SHA256 serialization of the genesis_state
.
/**
* Get the chain_id corresponding to this genesis state.
*
* This is the SHA256 serialization of the genesis_state.
*/
chain_id_type compute_chain_id() const;
/**
* @file
* @copyright defined in eos/LICENSE.txt
*/
#include <eosio/chain/genesis_state.hpp>
// these are required to serialize a genesis_state
#include <fc/smart_ref_impl.hpp> // required for gcc in release mode
namespace eosio { namespace chain {
genesis_state::genesis_state() {
initial_timestamp = fc::time_point::from_iso_string( "2018-06-01T12:00:00" );
initial_key = fc::variant(eosio_root_key).as<public_key_type>();
}
chain::chain_id_type genesis_state::compute_chain_id() const {
digest_type::encoder enc;
fc::raw::pack( enc, *this );
return chain_id_type{enc.result()};
}
} } // namespace eosio::chain
namespace chain {
struct chain_id_type : public fc::sha256 {
using fc::sha256::sha256;
template<typename T>
inline friend T& operator<<( T& ds, const chain_id_type& cid ) {
ds.write( cid.data(), cid.data_size() );
return ds;
}
template<typename T>
inline friend T& operator>>( T& ds, chain_id_type& cid ) {
ds.read( cid.data(), cid.data_size() );
return ds;
}
void reflector_verify()const;
private:
chain_id_type() = default;
// Some exceptions are unfortunately necessary:
template<typename T>
friend T fc::variant::as()const;
friend class eosio::chain_apis::read_only;
friend class eosio::net_plugin_impl;
friend struct eosio::handshake_message;
friend struct ::hello; // TODO: Rushed hack to support bnet_plugin. Need a better solution.
};
} } // namespace eosio::chain
/**
* @file
* @copyright defined in eos/LICENSE.txt
*/
#include <eosio/chain/chain_id_type.hpp>
#include <eosio/chain/exceptions.hpp>
namespace eosio { namespace chain {
void chain_id_type::reflector_verify()const {
EOS_ASSERT( *reinterpret_cast<const fc::sha256*>(this) != fc::sha256(), chain_id_type_exception, "chain_id_type cannot be zero" );
}
} } // namespace eosio::chain
namespace fc {
void to_variant(const eosio::chain::chain_id_type& cid, fc::variant& v) {
to_variant( static_cast<const fc::sha256&>(cid), v);
}
void from_variant(const fc::variant& v, eosio::chain::chain_id_type& cid) {
from_variant( v, static_cast<fc::sha256&>(cid) );
}
} // fc