有些时候,由于前期考虑不周,或者后期设计升级,导致合约table字段需要增加,或者类型需要更改,所以需要数据迁移,下面举例我常用的升级方法假设目前合约内有个tablexxxinfo
struct]xxxinfo{uint64_tid;uint64_ttest;//为测试添加的字段uint8_ttest1;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo"_n,xxxinfo>xxxinfo_tables;
现在升级需要解决的问题是test当初设计字段类型过大,导致ram浪费,test1选型过小,增加test2字段{uint32_t}.
Chainlink发布白皮书2.0,创始人表示其混合智能合约将定义行业的未来:Chainlink(LINK)在周四发布了新白皮书,其中详细说明了计划中的扩展,并着眼于创建用于计算的Oracle网络。Chainlink联合创始人Sergey Nazarov表示,新的Oracle网络将继续专注于区块链甚至第二层网络无法实现的功能。他还表示,Chainlink的混合智能合约将定义行业的未来。在白皮书概述的愿景中,Chainlink将推广并扩展其现有的计算能力。(Cointelegraph)[2021/4/15 20:24:34]
在合约中增加新的表结构xxxinfo1及其对象,并修正上面问题
智能合约钱包Authereum集成路印交易所:智能合约钱包Authereum集成路印交易所(LoopringExchange),这意味着用户使用Authereum可直接登入以太坊的二层支付方案zkRollup进行交易。[2020/9/7]
struct]xxxinfo1{uint64_tid;uint32_ttest;//为测试添加的字段uint16_ttest1;//为测试添加的字段uint32_ttest2;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo1"_n,xxxinfo1>xxxinfo1_tables;
微众银行和Digital Asset将基于开源智能合约DAML开展合作:近日,微众银行透露计划与分布式账本技术提供商Digital Asset开展合作。由DA公司研发的DAML智能合约引擎和由微众银行牵头金链盟开源工作组研发的FISCO BCOS底层平台,都是区块链领域的重要开源项目,双方将共同研究在FISCO BCOS上引入DAML智能合约引擎,为FISCO BCOS的开发者提供更多的智能合约开发方式。[2020/4/16]
此时合约内同时存在xxxinfo1和xxxinfo1两张表.
增加迁移执行的action接口
//.hACTIONmigratexxx();//.cppvoidmigratexxx(){xxxinfo1_tablesxxxinfo1_table(_self,_self.value);xxxinfo_tablesxxxinfo_table(_self,_self.value);autoitr=xxxinfo_table.begin();while(itr!=xxxinfo_table.end()){xxxinfo1_table.emplace(_self,(auto&h){h.id=xxxinfo1_table.available_primary_key();h.test=itr->test;h.test1=itr->test1;});itr++;}}
SMT最新公告:“以太坊智能合约溢出漏洞事件”已经得到全面控制:据SmartMesh(SMT)官方微博公告,此次“以太坊智能合约溢出漏洞事件”已经得到全面控制。对于此次溢出事件流出的“假币”,SMT基金会承诺将从公开流通市场进行回购,并进行销毁。[2018/4/27]
停止Dapp,避免迁移期间数据改变,然后执行actioncleos-uhttps://api.eoslaomao.compushaction合约账户migratexxx'{}'-p合约账户
如果数据较多,且数据是累计增长,可以分区间执行迁移,迁移过程中,可以不停止dapp,等迁移差不多追上旧表了,再暂停dapp,然后等数据全部迁移完.
修正合约中的新表为
struct]xxxinfo{uint64_tid;uint32_ttest;//为测试添加的字段uint16_ttest1;//为测试添加的字段uint32_ttest2;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo1"_n,xxxinfo>xxxinfo_tables;
将旧表修改为
struct]xxxinfo_bak{uint64_tid;uint64_ttest;//为测试添加的字段uint8_ttest1;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo"_n,xxxinfo_bak>xxxinfo_bak_tables;
修正前后端调用的table名,重新上线,并运行dapp,建议等运行一段时间,在删除旧表增加清理旧表的action
//.hACTIONclearxxxbak();//.cppvoidclearxxxbak(){xxxinfo_bak_tablesxxxinfo_bak_table(_self,_self.value);autoitr=xxxinfo_bak_table.begin();while(itr!=xxxinfo_bak_table.end()){itr=xxxinfo_bak_table.erase(itr);}}
然后执行actioncleos-upushaction合约账户clearxxxbak'{}'-p合约账户最后再删除合约内旧表及对象就完成了此次合约表升级过程。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。