我正在尝试理解智能契约映射。
想象一下,我有一个智能契约,可以创建一个对象"car“并存储在它的映射中。这个对象的参数类似于黑色值的“轮胎”。同时,我有一个功能,在相同的智能合同,可以改变轮胎从黑色到蓝色。在地图上,这辆车的轮胎是蓝色的。所以映射只存储汽车的最新状态?如果我想得到汽车所遭受的所有改装?我是否应该将映射从存储"cars“更改为存储”汽车修改“?如果一辆汽车有大约一百万的变化,这会是一个可行的解决方案吗?如果我一直保存着“汽车”,我如何才能获得它所遭受的所有修改?
此外,映射存储在哪里?
提前感谢
发布于 2018-09-27 16:10:05
一般说来,映射是分布式哈希表,提供一次移动查找和写入大量地址空间。地址空间是我们合同中唯一的。
https://medium.com/@robhitchens/solidity-crud-part-1-824ffa69509a
当我刚开始工作的时候,我很难找到一个关于mapping的好描述和实际例子,所以我决定在上面的博客中加入一个。向下滚动到基本工具-映射。
至于跟踪映射中状态的更改,您有两个选项。最常见的方法是依赖事件发射器为客户端创建所有重要状态更改的历史记录。这通常是因为契约逻辑通常只涉及当前状态。
在契约需要能够探索过去状态的奇怪情况下,映射和数组的一些复杂用法将能够构造这样的结构,但需要注意的是,它可能有点昂贵(气体)。
希望能帮上忙。
关于更简单的存储模式,请看一下这里:是否有妥善解决的和简单的存储模式的坚固性?
发布于 2019-01-02 16:34:59
密钥不与映射一起存储。这可能看起来很奇怪,因为在JavaScript中,Object.keys();检索所有的键,而映射则不是这样。
通过映射,我们使用了一个名为哈希表的经典数据结构。哈希表使用所谓的查找过程。
为了查找与此映射不同的值,我们必须提前提供一个键。我们提供这个键,它被传递给一个散列函数,哈希函数输出一些预先确定的索引。
在实体映射中,键不被存储。这意味着我们不能得到一个密钥列表,我们不能访问它们。我们不知道映射有什么钥匙。
映射的下一件事是值是不可迭代的。换句话说,我们不能循环遍历一个映射并打印出它所拥有的所有变量。
如果我们有一个映射,我们就不能编写一个遍历所有值的for循环。我们不能运行任何类型的函数或调用,要求进入映射并检索所有存在的值。
回到JavaScript世界中,我们可以使用Object.values();来实现这一点,但是我们在稳固性中没有这种功能。我们能做的就是查一查。
这些映射只适用于单个值查找。它们不适合存储我们希望在将来的某个时候遍历的信息,但我并不是建议您使用数组,因为在我已经在这个论坛上回答过几次的坚实世界中,数组也有其自身的缺点。
有了坚实的映射,“所有的价值都存在”。然而,对于JavaScript对象,如果没有定义密钥,并且我们试图访问它,则会得到undefined。
映射的情况并非如此。换句话说,如果我查找一个键,而不是告诉我们该特定索引上没有值,我们实际上会得到该元素的一些默认值。如果它们是字符串,则默认值为空字符串。
在JavaScript世界中,这意味着如果我试图查找一个不存在的键,我将不会返回undefined,而是一个空字符串。
返回的默认值取决于映射中值的值类型。
如果这些不是字符串,但假设是整数,那么我们会得到一个整数的零值,它实际上是数字0。
这使得判断一个值是否存在于映射中是很有挑战性的。如果您要将数字存储在映射的值中,并且希望为某个键找到一个值,然后查找一个字符串,然后返回数字0,则很难理解该值是否已经存在于映射中,并且它被设置为零或否,因为这是一个基于整数的默认值。
很难提前判断值是否存在映射。
积极的一面是,因为映射具有恒定时间查找的优点,我们希望确保我们的契约可以与许多不同的贡献者一起使用。
什么是恒定的时间?
数组和映射之间的最大区别是,在映射的内部进行搜索是计算机科学学科中所谓的恒定时间。
当我们说恒定时间时,这意味着无论我们在这个映射中存储了多少个数据,它总是要花费同样的时间。当考虑到数组需要线性时间时,这一点很重要--这意味着每当我们试图在数组中查找某个数据时,运行该搜索的最佳情况就是线性时间。当我们说数组中的搜索是线性时间时,这意味着我们添加到这个数组中的每一个额外的记录,执行搜索所需的时间就会稍微长一些。
如果你使用数组而不是映射,这将使你在油价问题上陷入麻烦。
发布于 2018-09-27 16:24:04
首先了解映射是如何工作的。在您的情况下,映射是指向对象或对象的地址。因此,如果对象内部有任何修改,它与映射无关--就像房子的地址,住在里面的人可以,并且它独立于房屋地址。现在讲到你的第二点,如果你想要控制一切,你应该使用事件和你想要跟踪的所有参数。现在,应该使用映射或数组的另一点;映射所需的气体比数组少。
https://ethereum.stackexchange.com/questions/59582
复制相似问题