コード例 #1
0
ファイル: address.cpp プロジェクト: NameShares/nameshares
    // TODO: This should return false rather than throwing
   bool address::is_valid( const std::string& base58str )
   { try {
      try
      {
          return is_valid_v1( base58str );
      }
      catch( ... )
      {
      }

      std::string prefix( BTS_ADDRESS_PREFIX );
      const size_t prefix_len = prefix.size();
      FC_ASSERT( base58str.size() > prefix_len );
      FC_ASSERT( base58str.substr( 0, prefix_len ) == prefix );
      std::vector<char> v = fc::from_base58( base58str.substr( prefix_len ) );
      FC_ASSERT( v.size() > 4, "all addresses must have a 4 byte checksum" );
      FC_ASSERT(v.size() <= sizeof( fc::ripemd160 ) + 4, "all addresses are less than 24 bytes");
      const fc::ripemd160 checksum = fc::ripemd160::hash( v.data(), v.size() - 4 );
      FC_ASSERT( memcmp( v.data() + 20, (char*)checksum._hash, 4 ) == 0, "address checksum mismatch" );
      return true;
   } FC_RETHROW_EXCEPTIONS( warn, "invalid address '${a}'", ("a", base58str) ) }
コード例 #2
0
ファイル: types.cpp プロジェクト: NONFish/bitshares-0.x
public_key_type::public_key_type( const std::string& base58str )
{
    // TODO:  Refactor syntactic checks into static is_valid()
    //        to make public_key_type API more similar to address API
    std::string prefix( BTS_ADDRESS_PREFIX );
    try
    {
        if( is_valid_v1( base58str ) )
            prefix = std::string( "BTSX" );
    }
    catch( ... )
    {
    }
    const size_t prefix_len = prefix.size();
    FC_ASSERT( base58str.size() > prefix_len );
    FC_ASSERT( base58str.substr( 0, prefix_len ) ==  prefix , "", ("base58str", base58str) );
    auto bin = fc::from_base58( base58str.substr( prefix_len ) );
    auto bin_key = fc::raw::unpack<binary_key>(bin);
    key_data = bin_key.data;
    FC_ASSERT( fc::ripemd160::hash( key_data.data, key_data.size() )._hash[0] == bin_key.check );
};