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