这次咱们将理解如何拜访合约中的公有数据(private 数据)。
指标合约
话不多说,间接上代码
这次咱们的指标合约是部署在 Ropsten 上的一个合约。
合约地址:0x3505a02BCDFbb225988161a95528bfDb279faD6b
链接:https://ropsten.etherscan.io/…
破绽剖析
由下面的合约代码咱们能够看到,Vault 合约将用户的用户名和明码这样的敏感数据记录在了合约中,咱们晓得合约中润饰变量的关键字仅限度其调用范畴,这也就间接证实了合约中的数据均是公开的,可任意读取的,将敏感数据记录在合约中是不平安的。
读取数据
首先,让咱们来学习一下 solidity 的 storage 存储形式:1)storage 中的数据被永恒存储。其以键值对的模式存储在 slot 插槽中。
2)storage 在插槽中数据从右向左排列,空间有余时,打包以后插槽,开启下一个插槽存储数据;存储定长数组(长度固定)时,数组中每一个数据占据一个插槽。
3)存储变长数组(长度随元素的数量而扭转)比拟非凡,在遇到变长数组时,会先启用一个新的插槽 slotA 用来存储数组的长度,其数据存储在另外的编号为 slotV 的插槽中。slotA 示意变长数组申明的地位,同时也存储着变长数组的长度 length:length = sload(slotA)用 slotV 示意变长数组数据存储的地位(即 key),index 示意 value 对应的索引下标:slotV = keccak256(slotA) + index
用 value 示意变长数组某个数据的值:value = sload(slotV)上面咱们就带大家来读取这个合约中的数据。首先咱们先看 slot0 中的数据:由合约中能够看到 slot0 中只存储了一个 uint 类型的数据,咱们读取进去看一下:我这里应用 Web3.py 获得数据,首先写好程序
运行后果:
“7b”是 16 进制数,转换成 10 进制数就是 123。这里咱们就胜利的去到了合约中的第一个插槽 slot0 中存储的 uint 类型的变量 count=123,上面咱们持续:slot1 中存储三个变量:u16, isTrue, owner
运行后果:
从右往左顺次为 owner = f36467c4e023c355026066b8dc51456e7b791d99isTrue = 01 = trueu16 = 1f = 31 slot2 中就存储着公有变量 password 咱们读取看看
运行后果:
slot 3, 4, 5 中存储着定长数组中的三个元素
运行后果:
slot6 中存储着变长数组的长度
运行后果:
返回的结果显示变长数组的长度为 3。咱们从合约代码中能够看到用户的 id 和 password 是由键值对的模式存储的,上面咱们来读取两个用户的 id 和 password:user1
运行后果:
user2
运行后果:
这样咱们就胜利的将合约中的所有数据读取实现。由此可见,合约中的公有数据也是能够读取的。总结大家能够看到,合约中的公有数据也是能够读取的,所以肯定不要将任何敏感数据寄存在合约中哦。如果想理解更多的智能合约和区块链常识,欢送到区块链交换社区 CHAINPIP 社区,一起交流学习~ 社区地址:https://www.chainpip.com/