solidity的mapping存储问题
发布于 7 个月前 作者 z6221668 459 次浏览 来自 智能合约

我们都知道区块链的数据是上链后就不能修改的,就关于这个有问题!

想法一:

每一次调用合约都会将数据存储在区块中(例如用数组保存幸运数的合约,会将你的幸运数连同合约保存在当前区块中),你第二次调用这个合约会将你第一次保存的数据复制过来,再加上你给的第二个幸运数保存在当前区块中(不是第一次调用的区块)。

换一种说法就是通过合约第一次的区块保存了数据为1的数组,你第二次调用时又获取[1]数组再加上你第二次调用的添加的幸运数2变为[1,2]数组,保存在第二次的区块中。这操作结果就是第一个区块中保存着[1],第二个区块中保存着[1,2]。

简单说你往合约中的数组添加数字,会先复制一份上一次调用的再添加上你刚添加的,再保存在当前区块中,上一次的因为不可篡改性不能删除。

想法二:

合约有一个独立的存储空间,数据保存在存储空间中,每一次调用就是对存储空间中的数组添加数字,区块中没有保存数据,只保存谁调用什么方法,输入参数等信息。

不知道哪一种想法是对的,还是两种都错?求大神解答!

2 回复

类似于第二个,区块中不保存具体的数据信息,其主要的信息有state root, tx root, receipt root。 其中state root是全局状态树的根hash,通过默克尔树来保证一致性,具体的数据都是存储在树的叶节点中(当然底层还是存储在数据库); tx root是当前块交易树的根hash(交易树中保存了交易的各项参数); receipt root是交易收据的根hash(包含事件,交易状态等内容)。 所以块里面是没有具体的交易参数信息、地址状态等等信息,所有的信息都在默克尔树中。

你上面的例子中,更新mapping数组时,系统先查询到你的合约地址的节点state,然后更新对应合约地址的storage。

回到顶部