很多区块链网络使用的智能合约功能类似于自动售货机。智能合约与自动售货机类比:如果你向自动售货机(类比分类账本)转入比特币或其他加密货币,一旦输入满足智能合约代码要求,它会自动执行双方约定的义务。
义务以“if then”形式写入代码,例如,“如果A完成任务1,那么,来自于B的付款会转给A。”通过这样的协议,智能合约允许各种资产交易,每个合约被复制和存储在分布式账本中。这样,所有信息都不能被篡改或破坏,数据加密确保参与者之间的完全匿名。
虽然智能合约只能与数字生态系统的资产一起使用,不过,很多应用程序正在积极探索数字货币之外的世界,试图连接“真实”世界和“数字”世界。
智能合约根据逻辑来编写和运作。只要满足输入要求,也就是说只要代码编写的要求被满足,合约中的义务将在安全和去信任的网络中得到执行。
UpgradeabilityProxy.sol
代码语言:javascript复制pragma solidity ^0.4.24;
import './Proxy.sol';
import './Address.sol';
/**
* @title UpgradeabilityProxy
* @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
*/
contract UpgradeabilityProxy is Proxy {
/**
* @dev This event will be emitted every time the implementation gets upgraded
* @param implementation representing the address of the upgraded implementation
*/
event Upgraded(address indexed implementation);
// Storage position of the address of the current implementation
bytes32 private constant implementationPosition = keccak256("org.zeppelinos.proxy.implementation");
/**
* @dev Constructor function
*/
constructor() public {}
/**
* @dev Tells the address of the current implementation
* @return address of the current implementation
*/
function implementation() public view returns (address impl) {
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 {
require(Address.isContract(newImplementation),"newImplementation is not a contractAddress");
bytes32 position = implementationPosition;
assembly {
sstore(position, newImplementation)
}
}
/**
* @dev Upgrades the implementation address
* @param newImplementation representing the address of the new implementation to be set
*/
function _upgradeTo(address newImplementation) internal {
address currentImplementation = implementation();
require(currentImplementation != newImplementation);
setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
}