以最简单的方式来说,区块链记录着更新账本状态的交易,且记录不可篡改。智能合约以编程方式访问账本两个不同的部分:一个是区块链(记录所有交易的历史,且记录不可篡改),另一个是世界状态(保存这些状态当前值的缓存,是经常需要用到的对象的当前值)。
智能合约主要在世界状态中将状态写入(put)、读取(get)和删除(delete),还可以查询不可篡改的区块链交易记录。
读取(get)操作一般代表的是查询,目的是获取关于交易对象当前状态的信息。
写入(put)操作通常生成一个新的业务对象或者对账本世界状态中现有的业务对象进行修改。
删除(delete)操作代表的是将一个业务对象从账本的当前状态中移除,但不从账本的历史中移除。
智能合约有许多可用的API。但重要的是,在任意情况下,无论交易创建、读取、更新还是删除世界状态中的业务对象,区块链都包含了这些操作的记录,且记录不可更改。
开发
1.合约中关于资产的数据结构的定义
输入字符串:“10.0000 CUR”
输出:amount=10,symbol(4,“CUR”)
/*asset includes amount and currency symbol/
struct asset:fc::reflect_init
{
//通过给定的符号名称以及资产数量构建一个新的资产对象。
explicit asset(share_type a=0,symbol id=symbol(CORE_SYMBOL)):amount(a),sym(id){
eosio_assert(is_amount_within_range(),asset_type_exception,"magnitude of asset amount must be less than 2^62");
eosio_assert(sym.valid(),asset_type_exception,"invalid symbol");
share_type amount;//资产数量
symbol_type symbol;//资产符号名称,详见以下symbol_type源码分析。
static constexpr int64_t max_amount=(1LL<<62)-1;//资产数量最大值,取决于int64_t类型的取值范围。
//检查资产数量是否在范围以内,是否超过了最大限额。
bool is_amount_within_range()const{return-max_amount<=amount&&amount<=max_amount;}
//检查资产对象是否有效,有效资产的数量应该小于等于最大限额同时它的符号名称也是有效的。
bool is_valid()const{return is_amount_within_range()&&symbol.is_valid();}
//设置资产的数量
void set_amount(int64_t a){
amount=a;
eosio_assert(is_amount_within_range(),"magnitude of asset amount must be less than 2^62");
}
//资产对象的运算符重载
...
//打印资产
void print()const
{
int64_t p=(int64_t)symbol.precision();
int64_t p10=1;
while(p>0)
{
p10*=10;
--p;
}
p=(int64_t)symbol.precision();
char fraction[p+1];
fraction[p]='';
auto change=amount%p10;
for(int64_t i=p-1;i>=0;--i)
{
fraction<i>=(change%10)+'0';
change/=10;
}
printi(amount/p10);
prints(".");
prints_l(fraction,uint32_t(p));
prints("");
symbol.print(false);
}
EOSLIB_SERIALIZE(asset,(amount)(symbol))
}
void reflector_init()const{
eosio_assert(is_amount_within_range(),asset_type_exception,"magnitude of asset amount must be less than 2^62");
eosio_assert(sym.valid(),asset_type_exception,"invalid symbol");
}
};
//using share_type=int64_t;
struct extended_asset{
//默认构造器,构造一个扩展资产对象
extended_asset(){}
//通过给定的数量和扩展符号构造一个扩展资产对象。
extended_asset(asset a,text_name n):quantity(a),contract(n){}
asset quantity;