區塊鏈質押DAPP系統開發模式講解方案(成熟程式碼)

Tg_StPv888發表於2023-02-22

 Fabric的智慧合約稱為鏈碼,分為系統鏈碼和使用者鏈碼。系統鏈程式碼用於實現系統級功能,使用者鏈程式碼用於實現使用者應用功能。鏈程式碼被編譯成一個獨立的應用程式,在隔離的 Docker 容器中執行。

結構智慧合約

Fabric的智慧合約稱為鏈碼,分為系統鏈碼和使用者鏈碼。系統鏈程式碼用於實現系統級功能,使用者鏈程式碼用於實現使用者應用功能。

鏈程式碼被編譯成一個獨立的應用程式,在隔離的 Docker 容器中執行。

結構鏈程式碼和底層賬本是分開的。升級鏈碼時,無需將賬本資料遷移到新的鏈碼,真正實現了邏輯與資料的分離。同時,鏈程式碼是用Go,Java和Nodejs語言編寫的。   鏈碼運作流程

  智慧合約由區塊鏈內的多個使用者共同參與制定,可用於使用者之間的任何交易行為。 協議中明確了雙方的權利和義務,開發人員將這些權利和義務以電子化的方式進行程式設計,程式碼中包含會觸發合約自動執行的條件。

  編碼完成後,將智慧合約就被安裝,例項化到區塊鏈網路中。

  執行合約,並將結果記錄到區塊鏈上。
  /**
  *Submitted for verification at Etherscan.io on 2018-12-18
  */  pragma solidity^0.4.23;  //This is the proxy contract for the TrustToken Registry  //File:contracts/Proxy/Proxy.sol  /**
  *title Proxy
  *dev Gives the possibility to delegate any call to a foreign implementation.
  */  contract Proxy{  /**
  *dev Tells the address of the implementation where every call will be delegated.
  *return address of the implementation to which it will be delegated
  */  function implementation()public view returns(address);  /**
  *dev Fallback function allowing to perform a delegatecall to the given implementation.
  *This function will return whatever the implementation call returns
  */  function()external payable{  address _impl=implementation();  require(_impl!=address(0),"implementation contract not set");  assembly{  let ptr:=mload(0x40)  calldatacopy(ptr,0,calldatasize)  let result:=delegatecall(gas,_impl,ptr,calldatasize,0,0)  let size:=returndatasize
  returndatacopy(ptr,0,size)  switch result
  case 0{revert(ptr,size)}  default{return(ptr,size)}  }  }  }  //File:contracts/Proxy/UpgradeabilityProxy.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("trueUSD.proxy.implementation");  /**
  *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{  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);  }  }  //File:contracts/Proxy/OwnedUpgradeabilityProxy.sol  /**
  *title OwnedUpgradeabilityProxy
  *dev This contract combines an upgradeability proxy with basic authorization control functionalities
  */  contract OwnedUpgradeabilityProxy is UpgradeabilityProxy{  /**
  *dev Event to show ownership has been transferred
  *param previousOwner representing the address of the previous owner
  *param newOwner representing the address of the new owner
  */  event ProxyOwnershipTransferred(address indexed previousOwner,address indexed newOwner);  /**
  *dev Event to show ownership transfer is pending
  *param currentOwner representing the address of the current owner
  *param pendingOwner representing the address of the pending owner
  */  event NewPendingOwner(address currentOwner,address pendingOwner);  //Storage position of the owner and pendingOwner of the contract  bytes32 private constant proxyOwnerPosition=keccak256("trueUSD.proxy.owner");  bytes32 private constant pendingProxyOwnerPosition=keccak256("trueUSD.pending.proxy.owner");  /**
  *dev the constructor sets the original owner of the contract to the sender account.
  */  constructor()public{  _setUpgradeabilityOwner(msg.sender);  }  /**
  *dev Throws if called by any account other than the owner.
  */  modifier onlyProxyOwner(){  require(msg.sender==proxyOwner(),"only Proxy Owner");  _;  }  /**
  *dev Throws if called by any account other than the pending owner.
  */  modifier onlyPendingProxyOwner(){  require(msg.sender==pendingProxyOwner(),"only pending Proxy Owner");  _;  }  /**
  *dev Tells the address of the owner
  *return the address of the owner
  */  function proxyOwner()public view returns(address owner){  bytes32 position=proxyOwnerPosition;  assembly{  owner:=sload(position)  }  }  /**
  *dev Tells the address of the owner
  *return the address of the owner
  */  function pendingProxyOwner()public view returns(address pendingOwner){  bytes32 position=pendingProxyOwnerPosition;  assembly{  pendingOwner:=sload(position)  }  }  /**
  *dev Sets the address of the owner
  */  function _setUpgradeabilityOwner(address newProxyOwner)internal{  bytes32 position=proxyOwnerPosition;  assembly{  sstore(position,newProxyOwner)  }  }  /**
  *dev Sets the address of the owner
  */  function _setPendingUpgradeabilityOwner(address newPendingProxyOwner)internal{  bytes32 position=pendingProxyOwnerPosition;  assembly{  sstore(position,newPendingProxyOwner)  }  }  /**
  *dev Allows the current owner to transfer control of the contract to a newOwner.
  *changes the pending owner to newOwner.But doesn't actually transfer
  *param newOwner The address to transfer ownership to.
  */  function transferProxyOwnership(address newOwner)external onlyProxyOwner{  require(newOwner!=address(0));  _setPendingUpgradeabilityOwner(newOwner);  emit NewPendingOwner(proxyOwner(),newOwner);  }  /**
  *dev Allows the pendingOwner to claim ownership of the proxy
  */  function claimProxyOwnership()external onlyPendingProxyOwner{  emit ProxyOwnershipTransferred(proxyOwner(),pendingProxyOwner());  _setUpgradeabilityOwner(pendingProxyOwner());  _setPendingUpgradeabilityOwner(address(0));  }  /**
  *dev Allows the proxy owner to upgrade the current version of the proxy.
  *param implementation representing the address of the new implementation to be set.
  */  function upgradeTo(address implementation)external onlyProxyOwner{  _upgradeTo(implementation);  }  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2936353/,如需轉載,請註明出處,否則將追究法律責任。

相關文章