MetaForce佛薩奇開發原理丨MetaForce佛薩奇系統開發(2.0智慧合約開發)

xiaofufu發表於2023-03-09

  一個智慧合約被編譯後就是一段EVM位元組碼,將它部署在以太坊的區塊鏈時,會根據部署者的地址和該地址的nonce分配一個合約地址


  合約地址和賬戶地址的格式是沒有區別的,但合約地址沒有私鑰,也就沒有人能直接操作該地址的合約資料。


  這也是合約的一個限制:合約不能主動執行,它只能被外部賬戶發起呼叫。如果一個合約要定期執行,那隻能由線下伺服器定期發起合約呼叫。


  mint函式,進行代幣增發,注意它是internal函式,所以外部是無法呼叫的


  function _mint(address to,uint256 value)internal{


  totalSupply=totalSupply.add(value);


  balanceOf[to]=balanceOf[to].add(value);


  emit Transfer(address(0),to,value);


  }


  _burn函式,進行代幣燃燒,同樣它也是internal函式


  function _burn(address from,uint256 value)internal{


  balanceOf[from]=balanceOf[from].sub(value);


  totalSupply=totalSupply.sub(value);


  emit Transfer(from,address(0),value);


  }開發邏輯及案例:MrsFu123


  _approve函式,進行授權操作,注意它是private函式,意味著只能在本合約內直接呼叫。不過,在子合約中可以透過一個內部或者公共的函式進行間接呼叫。


  function _approve(


  address owner,


  address spender,


  uint256 value


  )private{


  allowance[owner][spender]=value;


  emit Approval(owner,spender,value);


  }


  _transfer函式,轉移代幣操作,注意也是一個private函式


  function _transfer(


  address from,


  address to,


  uint256 value


  )private{


  balanceOf[from]=balanceOf[from].sub(value);


  balanceOf[to]=balanceOf[to].add(value);


  emit Transfer(from,to,value);


  }


  approve函式,注意它是external(外部)函式,使用者通常進行授權操作的外部呼叫介面。


  function approve(address spender,uint256 value)external returns(bool){


  _approve(msg.sender,spender,value);


  return true;


  }


  transfer函式,同上,使用者轉移代幣操作的外部呼叫介面。


  function transfer(address to,uint256 value)external returns(bool){


  _transfer(msg.sender,to,value);


  return true;


  }


  transferFrom代幣授權轉移函式,它是一個外部函式,主要是由第三方合約來呼叫。注意它的實現中(UniswapV2的實現)作了一個假定,如果你的授權額度為最大值為了減小操作步數和gas,呼叫時授權餘額是不扣除相應的轉移代幣數量的。這裡如果沒有授權(授權額度為0),那麼會怎樣呢?庫函式.sub(value)呼叫時無法透過SafeMath的require檢查,會導致整個交易會被重置。所以如果沒有授權,第三方合約是無法轉移你的代幣的,你不用擔心你的資產被別的合約隨便偷走。


  function transferFrom(


  address from,


  address to,


  uint256 value


  )external returns(bool){


  if(allowance[from][msg.sender]!=uint256(-1)){


  allowance[from][msg.sender]=allowance[from][msg.sender].sub(


  value


  );


  }


  _transfer(from,to,value);


  return true;


  }


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

相關文章