DAPP馬蹄鏈智能合約系統(tǒng)丨DAPP馬蹄鏈智能合約系統(tǒng)開發(fā)(案例)丨DAPP馬蹄鏈開發(fā)源碼
智能合約(或稱加密合約)是一種計算機程序,在一定條件下直接自動控制雙方的數(shù)字資產(chǎn)轉(zhuǎn)移。智能合約的工作方式與傳統(tǒng)合約相同,同時也自動執(zhí)行合約。
智能合約是完全按照其創(chuàng)建者的設(shè)置(編碼,編程)執(zhí)行的程序。就像傳統(tǒng)合同可由法律強制執(zhí)行一樣,智能合同可由代碼強制執(zhí)行。
代碼逐行解讀
確定的使用的Solidity版本
pragma solidity=0.5.16;
這兩行導(dǎo)入了該合約必須實現(xiàn)的接口IUniswapV2ERC20.sol和一個防溢出的數(shù)學(xué)工具庫SafeMath。一個合約實現(xiàn)的接口代表了它的基本功能;防溢出數(shù)學(xué)工具庫應(yīng)用很常見,主要是因為數(shù)值是可以無限大的,但是存儲位數(shù)是有限的。例如最大256位,因此最大的無符號整數(shù)就是是2**256-1。再大就會溢出,這時就會得到預(yù)期外的結(jié)果。
另外,因為在Solidity中,應(yīng)用最多的是無符號整數(shù),如果減法得到了負(fù)數(shù),根據(jù)二進制的表示法,結(jié)果會被認(rèn)為成另一個無符號整數(shù)。在早期的智能合約中,存在溢出漏洞或者得到負(fù)值而遭受損失的情況。當(dāng)前編寫的智能合約一般都會防范這種問題的發(fā)生,使用SafeMath工具庫是最常見的預(yù)防手段。注意,該庫里只有加、減和乘三種計算,沒有除法。因為除法不會有溢出;如果被零除,Solidity語言本身會報錯重置整個交易,不需要額外處理。
import"./interfaces/IUniswapV2ERC20.sol";
import"./libraries/SafeMath.sol";
定義了該合約必須實現(xiàn)導(dǎo)入的IUniswapV2ERC20接口。該接口是由標(biāo)準(zhǔn)ERC20接口加上自定義的線下簽名消息支持接口組成,所以UniswapV2ERC20也是一個ERC20代幣合約。最后一個花括號是作用域開始。開發(fā)需求I59案例2oo7詳細(xì)3O69
contract UniswapV2ERC20 is IUniswapV2ERC20{
代表在uint256(uint是它的同名)類型上使用SafeMath庫。Solidity中庫函數(shù)在指定調(diào)用實例時(例如本例中的.sub等)和Rust語言中的結(jié)構(gòu)體的方法類似,實例自動作為庫函數(shù)中的第一個參數(shù)。
using SafeMath for uint256;
這三行代碼定義了ERC20代幣的三個對外狀態(tài)變量(代幣元數(shù)據(jù)):名稱,符號和精度。這里的精度就是小數(shù)點位數(shù)。注意,由于該合約為交易對合約的父合約,而交易對合約是可以創(chuàng)建無數(shù)個的,所以這無數(shù)個交易對合約中的ERC20代幣的名稱、符號和精度都一樣。我們平常在交易所中看到的只是ERC20代幣的符號,從這里可以看出,符號是可以重復(fù)的,并不是唯一確定的。代幣之間根本區(qū)別是合約地址,這個是唯一的,不同的地址就是不同的代幣,哪怕合約代碼完全一樣。
//token名稱,案例及模式:yy625019
string public constant name="Uniswap V2";
//token縮寫
string public constant symbol="UNI-V2";
//token精度
uint8 public constant decimals=18;
記錄代幣發(fā)行總量的狀態(tài)變量。為什么是訪問權(quán)限是public的呢?主要是利用編譯器的自動構(gòu)造同名函數(shù)功能來實現(xiàn)相應(yīng)接口。
uint256 public totalSupply;
用一個map記錄每個地址的代幣余額
mapping(address=>uint256)public balanceOf;