石墨烯区块链开发实例

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了石墨烯区块链开发实例相关的知识,希望对你有一定的参考价值。

音乐家和制作人

1. 三个角色

  • 一个用户购买的音乐嵌入我们的网络cryptocurrency。
  • 一生产商(或工作室)专辑销售给用户和品牌的利润。
  • 一位音乐家与制作人协商合同以发行专辑。

2. 音乐家和制作人安全创建智能合约合同的能力

  • 创建合同
  • 同意合同条款
  • 完成合约并分配奖励
  • 处理不完整和过期的合同
  • 根据合同销售音乐专辑和分配利润的能力

创建音乐合同的一般过程包括创建、签署合同和发布专辑、合约到期。

3. 步骤

3.1. 添加数据结构

定义可用的数据类型。这些数据将存储在区块链上的状态数据库中。

class music_contract_object: public graphene::db::abstract_object < music_contract_object > {  
  public: static  
  const uint8_t space_id = implementation_ids;  
  static  
  const uint8_t type_id = impl_ music_contract_object_type;  
   
  uint32_t contract_id = 10;  
  account_id_type producer; // the account id of the producer  
  account_id_type musician; // the account id of the musician  
  asset amount; // contract amount  
  time_point_sec ratification_deadline; // deadline till the contract must be signed  
  time_point_sec contract_expiration; // contract expiration time  
  asset pending_fee; // fee for creating the contract  
  bool musician_signed = false; // whether the musician signed the contract  
};

创建一个数据库对象索引。此索引仅用于存储后端。然后我们可以像这样在数据库中注册对象:

void database::initialize_indexes()
{
 . . .
    add_index< primary_index<music_contract_index>>();
}

3.2. 定义操作

前面部分指定了我们网络的操作和验证器。

step1. 在网络上创建智能合约的关键参与者和功能。

struct music_contract_create_operation : public base_operation {
    struct fee_parameters_type {
        uint64_t fee       = 1 * GRAPHENE_BLOCKCHAIN_PRECISION;
    };
    asset              fee;
    account_id_type    producer;
    account_id_type    musician;
    asset              amount;
    uint32_t           contract_id=0;
    string             details;
    time_point_sec     ratification_deadline;
    time_point_sec     contract_expiration;
    void validate()const {
        FC_ASSERT( amount.amount > 0 );
        FC_ASSERT( producer != musician );
    }
    void get_required_active_authorities( flat_set<account_id_type>& a )const{ a.insert(producer); }
    account_id_type fee_payer()const { return producer; }
};

step2. (以类似的方式使用合约创建其他操作)添加评估器来检查智能合约的参数,eg. 估计的截止日期和一些网络用户同时充当音乐家和制作人的能力

class contract_create_evaluator : public evaluator< contract_create_evaluator>
{
    public:
    typedef music_contract_create_operation operation_type;
    void_result do_evaluate( const music_contract_create_operation& o );
    object_id_type do_apply( const music_contract_create_operation& o );
};

void_result contract_create_evaluator::do_evaluate(const music_contract_create_operation& o)
{
    FC_ASSERT( o.ratification_deadline > db().head_block_time() );
    FC_ASSERT( o.contract_expiration > db().head_block_time() );
    if(o.amount.asset_id == asset_id_type())
        FC_ASSERT( db().get_balance( o.producer, o.amount.asset_id ) >= (o.amount + o.fee) );
    return void_result();
}

object_id_type contract_create_evaluator::do_apply(const music_contract_create_operation& o)
{
    try {
       db().adjust_balance( o.producer, -o.amount );
       const music_contract_object& ctr = db().create<music_contract_object>([&]( music_contract_object& ctr) {
            ctr.contract_id                = o.contract_id;
            ctr.producer                   = o.producer;
            ctr.musician                   = o.musician;
            ctr.amount                     = o.amount;
            ctr. pending_fee               = o.fee;
            ctr.ratification_deadline      = o.ratification_deadline;
            ctr.contract_expiration        = o.contract_expiration;
       });
       return  ctr.id;
    } FC_CAPTURE_AND_RETHROW( (o) )
}

现在我们有一个功能性智能合约,可以检查参数并相应地执行操作。不幸的是,无法从源代码外部使用它。您可以通过两种方式访问​​智能合约:使用命令行界面或通过 HTTP API。当然,对于真正的项目,您可能希望同时实现这两个功能,甚至直接使用您的智能合约操作实现 GUI。

3. 3 访问操作

为智能合约创建一个简单的 API

step1. 定义一个包含所有可通过 HTTP 访问的函数的类:

class music_api
   {
      public:
         music_api(graphene::chain::database& db);
         ~music_api();
      /* explain */
         optional<music_contract_object>  get_contract( account_id_type publisher, uint32_t contract_id ) const;
      private:
         graphene::chain::database& _db;
      }; 
. . .
   optional<music_contract_object>  get_contract( account_id_type publisher, uint32_t contract_id ) const
   {
      optional< music_contract_object > result;
      try
      {
         result = _db.get_contract( publisher, contract_id );
      }
      catch ( ... ) {}
      return result;
   }

step2. 使用 FC_API 宏注册 API 及其函数:

FC_API(graphene::app::music_api,
       (get_contract)
       . . .
     ) It was originally published on https://www.apriorit.com/

参考
【1】. https://github.com/cryptonomex/graphene
【2】. https://www.apriorit.com/dev-blog/593-graphene-framework

以上是关于石墨烯区块链开发实例的主要内容,如果未能解决你的问题,请参考以下文章

石墨烯区块链软件升级

石墨烯开发者大会圆满落幕 Blockchain Centre助力行业交流

石墨烯区块链API

石墨烯核心技术深度分析

EOS 石墨烯介绍

60v60han石墨烯能跑多远?