主頁 > 區塊鏈 > ERC20 ERC677 代幣標準

ERC20 ERC677 代幣標準

2022-05-11 07:49:59 區塊鏈

背景

區塊鏈 1.0 btc
2.0 eth 可編程的時代

代幣是以太坊這類通用編程區塊鏈之上最顯著和有用的顯著形態
  • 代幣標準(ERC20、ERC721主要標準)是實作的最小化標準
  • 使用已存在的標準,可完成合約之前的互操作性
  • 成熟度帶來的安全性,代幣標準經過實戰驗證

參考資料:

https://eips.ethereum.org/EIPS/eip-20
https://eips.ethereum.org/erc
https://github.com/ethereum/EIPs

ERC20 代幣標準

最小單元

6個函式 function

// 獲取代幣發行總量
function totalSupply() public view returns (uint256)

// 獲取_owner用戶代幣余額數量
function balanceOf(address _owner) public view returns (uint256 balance)

// _owner給_to賬戶轉賬_value
function transfer(address _to, uint256 _value) public returns (bool success)

// 通過地址給_to賬戶轉賬_value  (_from賬戶必須授權給呼叫者權限去操作)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

// 授權_spender提款,最高金額_value
function approve(address _spender, uint256 _value) public returns (bool success)

// 回傳 _spender 仍然被允許從 _owner 提取的金額,
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

2個事件 event

需要在對應的函式中狀態變更時,對事件進行相關呼叫

// 轉賬事件
event Transfer(address indexed _from, address indexed _to, uint256 _value)
  
// 授權提款事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

可選單元

3個函式 function

// name 代幣名稱 
function name() public view returns (string)

// symbol 代幣符號
function symbol() public view returns (string)

// decimals 精度
function decimals() public view returns (uint8)
注意
  • 合約contract關鍵字之前需要加上abstract
  • 在抽象的函式內,添加virtual關鍵字
  • 繼承函式時,需要對繼承的函式加上override修飾符

沒有函式體的函式被稱為抽象函式

合約實體

ERC20.sol

pragma solidity ^0.6.0;

//ERC20標準
abstract contract ERC20 {

    function symbol() virtual public view returns (string memory);

    //六個函式
    function totalSupply() virtual public view returns (uint256 totalSupply);
    function balanceOf(address _owner) virtual public view returns (uint256 balance);
    function transfer(address _to, uint256 _value) virtual public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) virtual public returns (bool success);
    function approve(address _spender, uint256 _value) virtual public returns (bool success);
    function allowance(address _owner, address _spender) virtual public view returns (uint256 remaining);

    // 2個事件event
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

pkCoin

pragma solidity ^0.6.0;

import "./ERC20.sol";

contract pkCoin is ERC20 {

    uint256 _totalSupply;
    string  public _symbol;
    address public _owner;
    mapping(address=>uint256) _balances;
    mapping(address => mapping(address => uint256) ) _approve;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    constructor(uint256 totalSupply, string memory symbol) public {
        _totalSupply = totalSupply;
        _symbol = symbol;
        _owner = msg.sender;
    }
    
    // 自定義修飾符
    modifier onlyOwner(){
        require(msg.sender == _owner);
        // _代指的是使用函式修改器的函式體
        _;
    }

    function symbol() virtual override public view returns (string memory){
        return _symbol;
    }


    // 初始化空投
    function airDrop(address _to, uint256 _value) onlyOwner public{
        require(_to != address(0) && _value > 0 );
        _balances[_to] = _value;
        _totalSupply += _value;
    }

    // override復寫關鍵字
    function totalSupply() override public view returns (uint256 totalSupply) {
        totalSupply = _totalSupply;
        return totalSupply;

    }

    function balanceOf(address _owner) override public view returns (uint256 balance){
        require(_owner != address(0), "owner should not be empty !");
        return _balances[_owner];

    }

    function transfer(address _to, uint256 _value) override public returns (bool success){
        require( _to != address(0), "_to should be not empty!");
        require( _balances[msg.sender] >= _value || _value >0, "value should be valid!");
        _balances[msg.sender] -= _value;
        _balances[_to] += _value;
        success = true;
        emit Transfer(msg.sender, _to, _value);
        return success;

    }

    function transferFrom(address _from, address _to, uint256 _value) override public returns (bool success){
        require(_from != address(0) && _to != address(0));
        require(_balances[msg.sender] >= _value);
        
        // require( _approve[_from][msg.sender] >= _value);
        _approve[_from][msg.sender] -= _value;
        _balances[_to] += _value;
        _balances[_from] -= _value;
        success = true;
        emit Transfer(_from, _to, _value);
        return success;

    }

    function approve(address _spender, uint256 _value) override public returns (bool success){
        require(_spender  != address(0));
        require(_balances[msg.sender] >= _value && _value >0 );
        _approve[msg.sender][_spender] += _value;
        _balances[msg.sender] -= _value;
        success = true;
        emit Approval(msg.sender, _spender, _value);
        return success;

    }

    function allowance(address _owner, address _spender) override public view returns (uint256 remaining) {
        remaining = _approve[_owner][_spender];
        return remaining;

    }
}

ERC677 代幣標準

前述

ERC677 標準是 ERC20 的一個擴展,它繼承了 ERC20 的所有方法和事件,

差異

transferAndCall

增加了一個transferAndCall 方法

function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)

這個方法比 ERC20 中的 transfer 方法多了一個 data 欄位,這個欄位用于在轉賬的同時,攜帶用戶自定義的資料,在方法呼叫的時候,還會觸發Transfer(address,address,uint256,bytes) 事件,記錄下發送方、接收方、轉賬金額以及附帶資料,

onTokenTransfer

完成轉賬和記錄日志之后,代幣合約還會呼叫接收合約的onTokenTransfer方法,用來觸發接收合約的邏輯,這就要就接收ERC677代幣的合約必須實作onTokenTransfer方法,用來給代幣合約呼叫

function onTokenTransfer(address from, uint256 amount, bytes data) returns (bool success)

接收合約就可以在這個方法中定義自己的業務邏輯,可以在發生轉賬的時候自動觸發,換句話說,智能合約中的業務邏輯,可以通過代幣轉賬的方式來觸發自動運行,這就給了智能合約的應用場景有了很大的想象空間,

參考:
LINK 代幣合約 https://etherscan.io/address/0x514910771af9ca656af840dff83e8264ecf986ca#code
https://github.com/ethereum/EIPs/issues/677

漏洞案例-整數溢位

溢位原理

型別

  • 乘法溢位
  • 加法溢位
  • 減法溢位

demo

  • 缺陷代碼
pragma solidity ^0.6.0;

contract overFlow{
    //加法溢位
    //如果uint256 型別的變數達到了它的最大值(2**256 - 1),如果在加上一個大于0的值便會變成0
    function add_overflow() public view returns (uint256 _overflow) {
        uint256 max = 2**256 - 1;
        return max + 1;
    }


	//減法溢位
	//如果uint256 型別的變數達到了它的最小值(0),如果在減去一個小于0的值便會變成2**256-1(uin256型別的最大值)
	function sub_underflow() public view returns (uint256 _underflow) {
    	uint256 min = 0;
    	return min - 1;
	}
    
    //乘法溢位
	//如果uint256 型別的變數超過了它的最大值(2**256 - 1),最后它的值就會回繞變成0
	function mul_overflow() public view returns (uint256 _underflow) {
    	uint256 mul = 2**255;
    	return mul * 2;
	}
}

整數溢位防護

  • 修復代碼
pragma solidity ^0.6.0;

library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    // assert 和 require 區別在于,require 若失敗則會返還給用戶剩下的 gas, assert 則不會
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a / b;
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract safeOverflow{
    using SafeMath for uint256;
    
    //加法溢位
    //如果uint256 型別的變數達到了它的最大值(2**256 - 1),如果在加上一個大于0的值便會變成0
    function add_overflow() public view returns (uint256 _overflow) {
        uint256 max = 2**256 - 1;
        return max.add(1);
    }


	//減法溢位
	//如果uint256 型別的變數達到了它的最小值(0),如果在減去一個小于0的值便會變成2**256-1(uin256型別的最大值)
	function sub_underflow() public view returns (uint256 _underflow) {
    	uint256 min = 0;
    	return min.sub(1);
	}
    
    //乘法溢位
	//如果uint256 型別的變數超過了它的最大值(2**256 - 1),最后它的值就會回繞變成0
	function mul_overflow() public view returns (uint256 _underflow) {
    	uint256 mul = 2**255;
    	return mul.mul(2);
	}
}
Pickmea,lets do it!

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

標籤:區塊鏈

上一篇:管理面板中的Ajax更新產品(WooCommerce)

下一篇:返回列表

標籤雲
其他(140345) Python(32089) JavaScript(20228) Java(15566) C(13523) 區塊鏈(8222) AI(7469) 基礎類(6313) C#(6199) MySQL(6059) 爪哇(5782) html(5274) 腳本語言(PerlPython)(5129) 非技術區(4971) PHP(4959) 熊猫(4914) sql(4896) Linux(4708) 数组(4421) R(4352) Android(4323) 反应(3965) 数据框(3425) css(3369) C語言(3288) 节点.js(3168) C++語言(3117) Java相關(2746) 疑難問題(2699) json(2638) 列表(2519) 單片機工控(2479) 扑(2452) VBA(2421) 安卓(2420) 打字稿(2306) ASP.NET(2065) 细绳(2033) iOS(2002) Web開發(1951) MongoDB(1873) 網絡通信(1793) 蟒蛇-3.x(1774) 麻木的(1773) 循环(1769) 字典(1769) 數據庫相關(1767) VB基礎類(1755) 正则表达式(1737) .NETCore(1731) 镖(1718) 擅长(1710) 迅速(1685) C++(1649) 開發(1646) Unity3D(1632) 系統維護與使用區(1617) .NET技术(1606) HtmlCss(1591) 基礎和管理(1579)

熱門瀏覽
  • 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
最新发布
  • ERC20 ERC677 代幣標準

    背景 區塊鏈 1.0 btc 2.0 eth 可編程的時代 代幣是以太坊這類通用編程區塊鏈之上最顯著和有用的顯著形態 代幣標準(ERC20、ERC721主要標準)是實作的最小化標準 使用已存在的標準,可完成合約之前的互操作性 成熟度帶來的安全性,代幣標準經過實戰驗證 參考資料: https://ei ......

    uj5u.com 2022-05-11 07:49:59 more
  • 管理面板中的Ajax更新產品(WooCommerce)

    你能幫我嗎,我有任務:我需要撰寫代碼來更新 WooCommerce 產品(在管理頁面上)而無需重新加載頁面,我想使用 ajax。所以,我做了什么:我序列化資料并將其放入物件 for...

    uj5u.com 2022-05-10 12:11:42 more
  • 向PHP檔案發出AJAXJSON請求(決議錯誤)

    我有一個 PHP 檔案,我在其中從 geoJSON 檔案獲取資料,我正在瀏覽資料并將我需要的內容存盤在一個新的關聯陣列中,然后對其進行排序。我需要對此 PHP 檔案進行...

    uj5u.com 2022-05-10 12:11:04 more
  • 顯示從django資料庫到fullcalendar的事件

    我在一個 django 專案中,我想將 django 資料庫中的事件顯示到 fullcalendar。我遇到的問題類似于FullCalendar 不顯示事件,但我沒有使用 php,并且無法可視化我...

    uj5u.com 2022-05-10 12:10:28 more
  • 未捕獲的SyntaxError:ajax呼叫中的令牌無效或意外

    我有一個看起來像這樣的表格:<form id="login_form" class="border shadow p-3 rounded" method="post" style="width: 450px;"> <h1 class="text-ce...

    uj5u.com 2022-05-10 12:09:40 more
  • 檔案未在ajaxpostresponse.netcore上下載

    我在檔案回應方面遇到問題,它沒有下載檔案,請檢查以下包含控制器方法和 Ajax 后呼叫的代碼,那里的物件是在表單上輸入用戶的excel檔案,讀取并計算條件資料并相...

    uj5u.com 2022-05-10 12:08:46 more
  • 'QuerySet'物件沒有屬性'_meta',帶有ajax的Django

    我正在建立一個紋身店的網站。在我index看來,我首先顯示每個藝術家的所有紋身,但我試圖允許用戶按藝術家過濾紋身,然后使用 jquery/ajax 更新顯示所選藝術家紋...

    uj5u.com 2022-05-10 12:07:55 more
  • 文本溢位父級時附加鏈接

    我正在使用 Ajax 來獲取評論。默認情況下,評論文本被視為 max-height:90px。匯入評論時,如果文本長度比父元素長,我想附加一個鏈接。下面的代碼不能很好地作業...

    uj5u.com 2022-05-10 12:07:02 more
  • 單個CSV列正在使用HTML表中的多個列

    經過漫長的旅程來弄清楚如何將 .csv 檔案加載到表中,我遇到了另一個問題。我的 .csv 檔案中的一列正在拆分為我的 HTML 表中的其他列。部分問題在于檔案本身...

    uj5u.com 2022-05-10 12:06:03 more
  • PaypalCheckoutonShippingChange不適用于Ajax-Call

    當客戶在貝寶結賬時更改送貨地址時,我會使用“onShippingChange”來獲取它。但是,當我檢查給定的地址并拒絕它或需要更新運費時,它就不起作用了。沒有 ajax 呼...

    uj5u.com 2022-05-10 12:04:09 more