ACT:智能合约之合约数据表字段升级

有些时候,由于前期考虑不周,或者后期设计升级,导致合约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}.

以色列央行:智能合约或需要监管:6月21日消息,以色列中央银行发布的研究报告显示,智能合约可能需要监管以防止恶意行为。该报告称,允许任何人在区块链上编写智能合约可能会对整个系统构成重大风险。

此前报道,3月11日,以色列央行发布加密货币存款指南草案,要求银行对加密货币相关业务进行风险评估并为流出或流向加密货币的资金转移制定政策和程序。(彭博社)[2022/6/21 4:42:54]

在合约中增加新的表结构xxxinfo1及其对象,并修正上面问题

struct]xxxinfo1{uint64_tid;uint32_ttest;//为测试添加的字段uint16_ttest1;//为测试添加的字段uint32_ttest2;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo1"_n,xxxinfo1>xxxinfo1_tables;

币安将支持SUN智能合约置换:据最新消息,币安将支持SUN智能合约置换及 1:1,000 代币增量计划。所有用户持有的SUN旧代币将全部被转换为SUN新代币,并按照 1 SUN(旧代币) = 1,000 SUN(新代币) 的比例发放SUN新代币。代币置换完成后,SUN旧代币将被命名为SUNOLD,SUN新代币将承继SUN代码并更新其标识。6月18日中午12:00(香港时间)币安将开放SUN/USDT现货交易,SUN/BTC现货交易将不再开放。代币置换完成后,充值、提现开放时间将另行公告。此后,用户可以通过资产转换功能将SUNOLD(TRC20)转换为SUN新代币(TRC20)。[2021/6/8 23:21:27]

此时合约内同时存在xxxinfo1和xxxinfo1两张表.

Acala Contributor Yuzhu : Acala 正致力于冲破智能合约沙箱:据官方消息,币赢CoinW《共识52》第九期《Polkadot的进化之路——Acala能否掀起下一轮DeFi热潮?》主题AMA主题中Acala Contributor Yuzhu讲到:

目前市面上的智能合约仅仅只是一个封闭的沙箱,合约与链本身拥有一定的屏障,正如以太坊 EVM 所发行的 ERC-20 资产或是 Dapp 是无法直接用于以太坊原链本身的。而此前 Acala 已经添加了智能合约模块,Acala 团队正致力于冲破 EVM 封闭的智能合约沙箱,让基于 Acala 上层智能合约所构建的 Dapp 能与 Acala 原链本身的稳定币 aUSD 以及其他内置模块相互兼容,为未来基于 Acala 网络中的各式各样的上层 DeFi 应用打好坚实的基础。[2020/11/19 21:22:46]

增加迁移执行的action接口

声音 | V神:很后悔在以太坊中采用“智能合约”这个术语:V神在某社交软件中回复用户关于\"CryptoLaw\"讨论时称,明确一点,非常后悔采用“智能合约”一词。应该把它们称为更乏味或偏技术性的东西,也许就像“可持续性脚本”。[2018/10/15]

//.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++;}}

停止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合约账户最后再删除合约内旧表及对象就完成了此次合约表升级过程。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:0ms0-0:436ms