有些时候,由于前期考虑不周,或者后期设计升级,导致合约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}.
IntoTheBlock:加密市场出现底部信号,但宏观环境仍然不稳定:1月23日消息,加密货币分析平台IntoTheBlock表示,尽管链上数据暗示加密资产熊市底部,但整体宏观环境仍然不稳定。IntoTheBlock发现,长期比特币持有者或拥有BTC至少一年的交易者的BTC数量在2022年激增,此类投资者以在熊市期间购买BTC并创造支撑位而闻名。“在2022年,我们看到持有一年以上的地址(Hodlers)拥有的比特币数量从1000万枚BTC增加到1500万枚BTC,增长50%。这种模式在以前的熊市中已经被观察到,只有在(价格)创下新高之后,Hodlers的余额才会下降。”
此外,目前有一半的比特币持有者处于亏损状态,最近几次比特币价格在熊市触底时也是这样的情况。(The Daily Hodl)[2023/1/23 11:26:52]
在合约中增加新的表结构xxxinfo1及其对象,并修正上面问题
佳士得将于10月1日拍卖ArtBlocksCurated:Sets1-3:9月8日消息,拍卖行佳士得宣布将于10月1日在纽约举行的拍卖会战后至今(Post-War to Present)中拍卖 Art Blocks Curated:Sets 1-3,竞拍将接受 ETH 为支付方式。[2021/9/8 23:08:35]
struct]xxxinfo1{uint64_tid;uint32_ttest;//为测试添加的字段uint16_ttest1;//为测试添加的字段uint32_ttest2;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo1"_n,xxxinfo1>xxxinfo1_tables;
动态 | 分布式资产管理协议RigoBlock启动GRG令牌的公开销售:据bitcoinist消息,瑞士Lugano公司宣布其分布式资产管理协议RigoBlock将启动GRG令牌的公开销售。销售将使用“了解您的客户”(KYC)和“反”(AML)流程,以合规的方式进行。该举动将促使用户加大对项目贡献兴趣并加快令牌销售。[2018/10/24]
此时合约内同时存在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++;}}
动态 | Stryking完成拜仁主题数字收藏品拍卖,成交额超过240 ETH:区块链初创公司Stryking最近已完成了以出售的拜仁慕尼黑足球俱乐部授权数字收藏品为主题的圣诞拍卖,总成交额超过240ETH(约3万美元)。此前报道:10月,德甲足球豪门拜仁慕尼黑(FC Bayern)与Animoca Brands的子公司Stryking Entertainment签署了一项新的合作协议,以生产和分销以拜仁球员为主题的数字收藏品。(SludgeFeed)[2019/12/30]
停止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合约账户最后再删除合约内旧表及对象就完成了此次合约表升级过程。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。