bytes32 position=implementationPosition;
assembly{
impl:=sload(position)
}
}
/**
*dev Sets the address of the current implementation
*param newImplementation address representing the new implementation to be set
*/
function _setImplementation(address newImplementation)internal{
bytes32 position=implementationPosition;
assembly{
sstore(position,newImplementation)
}
}
function upgradeTo(address impl)public onlyOwner{
require(_implementation!=impl);
_implementation=impl;
Upgraded(impl);
}
function()payable public{
address _impl=implementation();
require(_impl!=address(0));
bytes memory data=msg.data;
assembly{
let result:=delegatecall(gas,_impl,add(data,0x20),mload(data),0,0)
let size:=returndatasize
let ptr:=mload(0x40)
returndatacopy(ptr,0,size)
switch result
case 0{revert(ptr,size)}
default{return(ptr,size)}
}
}
尽管新技术十分强大,我们仍需要几年的时间才能在大多数行业中实施。有如下几点原因,首先,智能合约可能变得非常复杂。智能合约通常需要不止一份智能合约才能完成任务。通常需要链接在一起的众多智能合约来涵盖可能发生的所有情况。在这项技术的发展初期,可能会对程序员构成挑战。人工智能有可能简化该过程。在此之前,预计在处理高度复杂的交易时偶尔会出现错误。
其次,如前所述,这项技术最适合物联网。没有物联网,智能合约本身就无法与现实世界相互作用。智能合约需要一个实体,有时也称为“oracle”,可知晓任务何时完成。这种“单点故障”会降低智能合同的分散性和安全性。
而对变长数组来讲,它的KEY看起来是突然变化,并没有按顺序增长,但实际上solidity在内部使用了一个算法来计算变长数组的存储位置,然后再根据数组的KEY来增长KEY值,而我们想像的插槽位置0存储的是什么呢?这里存储的是数组的长度。所以一定要注意变长数组与定长数组的存储区别。
大小固定的变量(除了映射,变长数组以外的所有类型)在存储(storage)中是依次连续从位置0开始排列的。如果多个变量占用的大小少于32字节,会尽可能的打包到单个storage槽位里,具体规则如下:
在storage槽中第一项是按低位对齐存储(lower-order aligned)
基本类型存储时仅占用其实际需要的字节。
如果基本类型不能放入某个槽位余下的空间,它将被放入下一个槽位。
结构体和数组总是使用一个全新的槽位,并占用整个槽(但在结构体内或数组内的每个项仍遵从上述规则)
在这个规则中,我们可以知道,如果优化SOLIDITY的存储,即尽量的让变量可以组合成32个字节这样的数据,这样才能消耗更少的GAS。