有些时候,由于前期考虑不周,或者后期设计升级,导致合约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}.
一地址通过adidas NFT智能合约漏洞绕过限购抢到330个NFT,获利约60万美元:12月24日消息,据Sprise联合创始人Montana Wong在推特上透露,虽然阿迪达斯此前设定adidas NFT销售上限为每人最多2件,但有人利用漏洞绕过此限制在单次交易中购买了330个。
据悉,在销售活动启动之前几个小时部署了一个新智能合约,该智能合约执行后可以生成165 个子智能合约,每个子智能合约能给分别从阿迪达斯的智能合约中铸造2 个 NFT,然后再将它们转移到创建者的主ETH 地址上。由于每个子智能合约都有一个唯一地址,因此创建者能够绕过每人 2 个NFT销售限制,将 NFT 发送到创建者的主地址后,子智能合约会自动销毁。这个智能合约的创建者一共支付了 27.3 ETH的 gas 费用来执行相关交易,另外还支付了 66 ETH来购买adidas NFT,理论上目前该智能合约创建者已经获利约60万美元。[2021/12/24 8:02:33]
在合约中增加新的表结构xxxinfo1及其对象,并修正上面问题
动态 | Placeholder合伙人Burniske建议将术语智能合约改为数字合约:加密货币风投机构 Placeholder 合伙人 Chris Burniske 建议将区块链和加密货币领域中常用的概念“智能合约”改为更贴近真实情况的“数字合约”。他表示,并不是所有合约都是智能的,但都是数字化的,因为任何人都可以接受这个概念:我们正在进入一个数字化的时代。在他发表的建议之下,不少用户认为这个建议是合理的,但也有用户表示不认同,因为像智能手机或智能汽车的概念可以让智能合约更像是 2019 年的术语,而数字化这个前缀听起来有点像是90年代的术语。[2019/12/30]
struct]xxxinfo1{uint64_tid;uint32_ttest;//为测试添加的字段uint16_ttest1;//为测试添加的字段uint32_ttest2;//为测试添加的字段autoprimary_key()const{returnid;}};typedefeosio::multi_index<"xxxinfo1"_n,xxxinfo1>xxxinfo1_tables;
动态 | 智能合约平台RSK母公司收购拉丁美洲社交网站Taringa:据Bitcoinmagazine消息, 和比特币双向锚定的智能合约平台Rootstock(RSK)网络的母公司IOV Labs,近日收购了拉丁美洲社交网站Taringa,交易金额未公开。Taringa是一个拥有3000万用户的强大网络。此次收购有望为IOVLabs提供宝贵的数据和信息,这些数据和信息是IOVLabs大规模测试和去中心化基础设施建设所必需的。[2019/9/28]
此时合约内同时存在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++;}}
田纳西州紧随佛罗里达州和内布拉斯加州 或将在法律层面承认区块链签名与智能合约:1月10日田纳西州州议员杰森·鲍威尔(Jason Powell)向田纳西众议院提交一项新法案,该法案将承认区块链签名是合法的电子记录,回应了在佛罗里达州和内布拉斯加州提交的类似法案。与其他的法案一样,该法案澄清了在满足特定条件的情况下触发的智能合约或自行执行的协议在田纳西州也将具有法律效力。与交易有关的任何合同都不应仅仅因为合同中含智能合约的条款而被剥夺法律效力,有效性或可执行性。[2018/1/13]
停止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合约账户最后再删除合约内旧表及对象就完成了此次合约表升级过程。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。