主頁 > 區塊鏈 > uniswap factory工廠合約學習

uniswap factory工廠合約學習

2021-09-08 11:25:04 區塊鏈

目錄

  • 1、核心流程
    • 2、合約結構
    • 3、創建流動性
    • 3、交易
  • 4、代碼注釋
  • 5、代碼逐行解讀
    • 5.1 簡單代碼部分
    • 5.2 創建交易對代碼:createPair函式

1、核心流程

  1. uniswap核心合約分為3個合約,工廠合約,配對合約,ERC20合約
  2. 核心合約布署時只需要布署工廠合約
  3. 工廠合約布署時建構式只需要設定一個手續費管理員
  4. 在工廠合約布署之后,就可以進行創建配對的操作
  5. 要在交易所中進行交易,操作順序是:創建交易對,添加流動性,交易
  6. 添加配對時需要提供兩個token的地址,隨后工廠合約會為這個交易對布署一個新的配對合約
  7. 配對合約的布署是通過create2的方法
  8. 兩個token地址按2進制大小排序后一起進行hash,以這個hash值作為create2的salt進行布署
  9. 所以配對合約的地址是可以通過兩個token地址進行create2計算的
  10. 用戶可以將兩個token存入到配對合約中,然后在配對合約中為用戶生成一種兼容ERC20的token
  11. 配對合約中生成的erc20Token可以成為流動性
  12. 流動性的token可以進行erc20的操作,可以將流動性token傳送給其他用戶
  13. 用戶也可以取出流動性,配對合約將銷毀流動性,并將兩種token同時返還用戶
  14. 返還的數量將根據流動性數量和兩種token的儲備量重新計算,如果有手續費收益,用戶也將得到收益
  15. 用戶可以通過一種token交換另一種token,配對合約將扣除千分之3的手續費
  16. 在uniswap核心合約基礎上,還有一個路由合約用來更好的操作核心合約
  17. 路由合約擁有3部分操作方法,添加流動性,移除流動性,交換
  18. 雖然配對合約已經可以完成所有的交易操作,但路由合約將所有操作整合,配合前端更好的完成交易
  19. 因為路由合約的代碼量較多,布署時會超過gas限制,所以路由合約被分為兩個版本,功能互相補充

2、合約結構

在這里插入圖片描述

3、創建流動性

在這里插入圖片描述

3、交易

在這里插入圖片描述

4、代碼注釋

pragma solidity =0.5.16;

import './interfaces/IUniswapV2Factory.sol';
import './UniswapV2Pair.sol';

//uniswap工廠合約,實作了IUniswapV2Factory介面
contract UniswapV2Factory is IUniswapV2Factory {
	// 這個狀態變數主要是用來切換開發團隊手續費開關,在UniswapV2中,用戶在交易代幣時,會被收取交易額的千分之三的手續費分配給所有流動性供給者,如果feeTo不為零地址,則代表開關打開,此時會在手續費中分1/6給開發團隊,feeTo設定為零地址(默認值),則開關關閉,不從流動性供給者中分走1/6手續費,也就是總的千分之五,它的訪問權限設定為public后編譯器會默認構建一個同名public函式,正好用來實作IUniswapV2Factory.sol中定義的相關介面,
    address public feeTo;
    // 這個狀態變數是用來記錄誰是feeTo設定者,其讀取權限設定為public的主要目的同上,
    address public feeToSetter;
    // 這個狀態變數是用來記錄所有的交易對地址,實作了IUniswapV2Factory的getPair方法,前兩個分別為交易對中兩種ERC20代幣合約的地址,最后一個是交易對合約本身的地址,
    mapping(address => mapping(address => address)) public getPair;
    // 記錄所有交易對地址的陣列,實作了IUniswapV2Factory的allPairs方法,因為上面map雖然存盤了所有交易對,但是無法遍歷
    address[] public allPairs;
    // 配對合約的Bytecode的hash
    bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(UniswapV2Pair).creationCode));
    // 交易對被創建時觸發的事件,注意引數中的indexed表明該引數可以被監聽端(輕客戶端)過濾,
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    /**
     * @dev 建構式,引數提供了一個初始feeToSetter地址作為feeTo的設定者地址,不過此時feeTo仍然為默認值零地址,開發團隊手續費未打開,
     * @param _feeToSetter 收稅開關權限控制
     */
    constructor(address _feeToSetter) public {
        feeToSetter = _feeToSetter;
    }

    /**
     * @dev 回傳所有交易對地址陣列的長度
     */
    function allPairsLength() external view returns (uint) {
        return allPairs.length;
    }

    /**
     * 該函式接受任意兩個代幣地址為引數,用來創建一個新的交易對合約并回傳新合約的地址,注意,它的可見性為external并且沒有任何限定,意味著合約外部的任何賬號(或者合約)都可以呼叫該函式來創建一個新的ERC20/ERC20交易對(前提是該ERC20/ERC20交易對并未創建),
     * @param tokenA TokenA
     * @param tokenB TokenB
     * @return pair 配對地址
     * @dev 創建配對
     */
    function createPair(address tokenA, address tokenB) external returns (address pair) {
        // 來驗證兩種代幣的合約地址不能相同,也就交易對必須是兩種不同的ERC20代幣
        require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
        // 將tokenA和tokenB進行大小排序,確保tokenA小于tokenB
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        // 確認token0不等于0地址,用來驗證兩個地址不能為零地址,為什么只驗證了token0呢,因為token1比它大,它不為零地址,token1肯定也就不為零地址
        require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
        // 驗證交易對未被創建
        require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
        // 給bytecode變數賦值"UniswapV2Pair"合約的創建位元組碼
        bytes memory bytecode = type(UniswapV2Pair).creationCode;
        // 將token0和token1打包后創建哈希
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        // 行內匯編
        // solium-disable-next-line
        assembly {
            //通過create2方法布署合約,并且加鹽,回傳地址到pair變數
            pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        // 呼叫pair地址的合約中的"initialize"方法,傳入變數token0,token1
        IUniswapV2Pair(pair).initialize(token0, token1);
        // 配對映射中設定token0=>token1=pair
        getPair[token0][token1] = pair;
        // 配對映射中設定token1=>token0=pair
        getPair[token1][token0] = pair; // populate mapping in the reverse direction
        // 配對陣列中推入pair地址
        allPairs.push(pair);
        // 觸發配對成功事件
        emit PairCreated(token0, token1, pair, allPairs.length);
    }

    /**
     * @dev 用來設定新的feeTo以切換開發團隊手續費開關(可以為開發團隊接收手續費的地址,也可以為零地址),注意,該函式首先使用require函式驗證了呼叫者必須為feeTo的設定者feeToSetter,如果不是則會重置整個交易,
     * @param _feeTo 收稅地址
     */
    function setFeeTo(address _feeTo) external {
        require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
        feeTo = _feeTo;
    }

    /**
     * @dev 該函式用來轉讓feeToSetter,它首先判定呼叫者必須是原feeToSetter,否則重置整個交易,
     * @param _feeToSetter 收稅權限控制
     */
    function setFeeToSetter(address _feeToSetter) external {
        require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
        feeToSetter = _feeToSetter;
    }
}

5、代碼逐行解讀

5.1 簡單代碼部分

  1. 代碼的第一行,設定使用的Solidity編譯器的版本,這里估計是為了更嚴謹,使用了精確的編譯器版本0.5.16,而不是我們常用的>= 0.5.16或者^0.5.16
pragma solidity =0.5.16;
  1. 代碼中的兩個import陳述句分別匯入了factory所必須實作的介面合約及交易對模板合約
import './interfaces/IUniswapV2Factory.sol';
import './UniswapV2Pair.sol';
  1. contract UniswapV2Factory is IUniswapV2Factory 定義了UniswapV2Factory合約是一個IUniswapV2Factory,它必須實作其所有介面,
contract UniswapV2Factory is IUniswapV2Factory 
  1. feeTo這個狀態變數主要是用來切換開發團隊手續費開關,在UniswapV2中,用戶在交易代幣時,會被收取交易額的千分之三的手續費分配給所有流動性供給者,如果feeTo不為零地址,則代表開關打開,此時會在手續費中分1/6給開發團隊,feeTo設定為零地址(默認值),則開關關閉,不從流動性供給者中分走1/6手續費,它的訪問權限設定為public后編譯器會默認構建一個同名public函式,正好用來實作IUniswapV2Factory.sol中定義的相關介面,
address public feeTo;
  1. feeToSetter這個狀態變數是用來記錄誰是feeTo設定者,其讀取權限設定為public的主要目的同上,
address public feeToSetter;
  1. mapping(address => mapping(address => address)) public getPair;這個狀態變數是一個map(其key為地址型別,其value也是一個map),它用來記錄所有的交易對地址,注意,它的名稱為getPair并且為public的,這樣的目的也是讓默認構建的同名函式來實作相應的介面,注意這行代碼中出現了三個address,前兩個分別為交易對中兩種ERC20代幣合約的地址,最后一個是交易對合約本身的地址,
mapping(address => mapping(address => address)) public getPair;
  1. allPairs,記錄所有交易對地址的陣列,雖然交易對址前面已經使用map記錄了,但map無法遍歷,如果想遍歷和索引,必須使用陣列,注意它的名稱和權限,同樣是為了實作介面,
address[] public allPairs;
  1. 配對合約的Bytecode的hash
bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(UniswapV2Pair).creationCode));
  1. event PairCreated(address indexed token0, address indexed token1, address pair, uint);交易對被創建時觸發的事件,注意引數中的indexed表明該引數可以被監聽端(輕客戶端)過濾,
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
  1. 構造器,很簡單,引數提供了一個初始feeToSetter地址作為feeTo的設定者地址,不過此時feeTo仍然為默認值零地址,開發團隊手續費未打開,
constructor(address _feeToSetter) public {
    feeToSetter = _feeToSetter;
}
  1. 這個函式非常簡單,回傳所有交易對地址陣列的長度,這樣在合約外部可以方便使用類似for這樣的形式遍歷該陣列,
function allPairsLength() external view returns (uint) {
    return allPairs.length;
}
  1. 用來設定新的feeTo以切換開發團隊手續費開關(可以為開發團隊接收手續費的地址,也可以為零地址),注意,該函式首先使用require函式驗證了呼叫者必須為feeTo的設定者feeToSetter,如果不是則會重置整個交易,
function setFeeTo(address _feeTo) external {
    require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
    feeTo = _feeTo;
}
  1. 該函式用來轉讓feeToSetter,它首先判定呼叫者必須是原feeToSetter,否則重置整個交易,
function setFeeToSetter(address _feeToSetter) external {
    require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
    feeToSetter = _feeToSetter;
}

但這里有可能存在這么一種情況:當原feeToSetter不小心輸錯了新的設定者地址_feeToSetter時,設定會立即生效,此時feeToSetter為一個錯誤的或者陌生的無控制權的地址,無法再通過該函式設定回來,雖然UniswapV2團隊不會存在這種疏忽,但是我們自己在使用時,還是有可能發生的,有一種方法可以解決這個問題,就是使用一個中間地址值過渡一下,而新的feeToSetter必須再呼叫一個接受方法才能真正成為設定者,如果在接受之前發現設定錯誤,原設定者可以重新設定,具體代碼實作可以參考下面的Owned合約的owner轉讓實作:

pragma solidity ^0.4.24;
contract Owned {
    address public owner;
    address public newOwner;

    event OwnershipTransferred(address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner,"invalid operation");
        _;
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }
    function acceptOwnership() public {
        require(msg.sender == newOwner,"invalid operation");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

5.2 創建交易對代碼:createPair函式

該函式接受任意兩個代幣地址為引數,用來創建一個新的交易對合約并回傳新合約的地址,注意,它的可見性為external并且沒有任何限定,意味著合約外部的任何賬號(或者合約)都可以呼叫該函式來創建一個新的ERC20/ERC20交易對(前提是該ERC20/ERC20交易對并未創建)

  1. 用來驗證兩種代幣的合約地址不能相同,也就交易對必須是兩種不同的ERC20代幣,
 require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
  1. 用來對兩種代幣的合約地址從小到大排序,因為地址型別底層其實是uint160,所以也是有大小可以排序的,
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
  1. 用來驗證兩個地址不能為零地址,為什么只驗證了token0呢,因為token1比它大,它不為零地址,token1肯定也就不為零地址
require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
  1. 驗證交易對并未創建(不能重復創建相同的交易對)
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); 
  1. 用來獲取交易對模板合約UniswapV2Pair的創建位元組碼creationCode,注意,它回傳的結果是包含了創建位元組碼的位元組陣列,型別為bytes,類似的,還有運行時的位元組碼runtimeCode,creationCode主要用來在內嵌匯編中自定義合約創建流程,特別是應用于create2操作碼中,這里create2是相對于create操作碼來講的,注意該值無法在合約本身或者繼承合約中獲取,因為這樣會導致自回圈參考
bytes memory bytecode = type(UniswapV2Pair).creationCode;
  1. 第6行用來計算一個salt,注意,它使用了兩個代幣地址作為計算源,這就意味著,對于任意交易對,該salt是固定值并且可以線下計算出來
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
  1. assembly代表這是一段內嵌匯編代碼,Solidity中內嵌匯編語言為Yul語言,在Yul中,使用同名的內置函式來代替直接使用操作碼,這樣更易讀,后面的左括號代表內嵌匯編作用域開始,
 assembly {
  1. 在Yul代碼中使用了create2函式(該函式名表明使用了create2操作碼)來創建新合約,
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
  1. 呼叫新創建的交易對合約的一個初始化方法,將排序后的代幣地址傳遞過去,為什么要這樣做呢,因為使用create2函式創建合約時無法提供構造器引數,
IUniswapV2Pair(pair).initialize(token0, token1);
  1. 用來將交易對地址記錄到map中去,因為:1、A/B交易對同時也是B/A交易對;2、但在查詢交易對時,用戶提供的兩個代幣地址并沒有排序,所以需要記錄兩次
getPair[token0][token1] = pair;
getPair[token1][token0] = pair;
  1. 交易對地址記錄到陣列中去,便于合約外部索引和遍歷,
allPairs.push(pair);
  1. 觸發交易對創建事件
emit PairCreated(token0, token1, pair, allPairs.length);

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/298422.html

標籤:區塊鏈

上一篇:IPFS最新資訊:fil還能在漲多少?Filecoin基金會推出存盤提供者的賞金獎勵計劃!

下一篇:UDA:萬億級碎片化資料價值市場的撬動者

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more