Table of Contents

LikeCoin 代幣付款委託

Table of Contents

使用 ERC-20 代幣作為交易費用


若你試過 like.co 的點對點轉賬功能,你會懷疑何解你能轉賬 ERC-20 代幣而不用付出以太幣作交易費用。

LikeCoin 代幣付款委託
付出0.0011252ETH作交易費用,以傳送100LIKE

你可以使用 MetaMask 處理一般的 ERC-20 代幣轉賬。你會發現你需要付出例如 0.0011252ETH 作交易費用。

讓我們來看看一般用作傳送 ERC-20 代幣的智能合約:

// LikeCoin.sol
function _transfer(address _from,
address _to,
uint256 _value)
internal returns (bool success) {
_tryUnlockBalance(_from);
require(_from != 0x0);
require(_to != 0x0);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(_from, _to, _value);
return true;
}// LikeCoin.sol
function transfer(address _to,
uint256 _value)
public returns (bool success) {
return _transfer(msg.sender, _to, _value);
}

很簡單,就是確認 _from_to 不是 0x0,然後於 _from 減去傳送金額,再於 _to 加上傳送金額,完成。

然而,若使用代幣付款委託服務,例如你想發送 100 LIKE 給我,你會發現:

LikeCoin 代幣付款委託
like.co 上的點對點轉賬頁面

點擊「確認」鍵後,你只須在 MetaMask 上簽署,便能傳送 100LIKE到我以太坊上的地址,而毋須支付任何以太幣作交易費。

LikeCoin 代幣付款委託
簽署確認傳送LikeCoin

讓我們來看看智能合約中 trasferDelegated 的源代碼,揭開箇中的秘密吧:

// LikeCoin.sol
function transferDelegated(address _from,
address _to,
uint256 _value,
uint256 _maxReward,
uint256 _claimedReward,
uint256 _nonce,
bytes _signature)
isDelegated(_from, _maxReward, _claimedReward, _nonce)
public returns (bool success) {
require(signatureChecker.checkTransferDelegated(_from,
_to,
_value,
_maxReward,
_nonce,
_signature));
return _transfer(_from, _to, _value);
}// LikeCoin.sol
modifier isDelegated(address _from, uint256 _maxReward, uint256 _claimedReward, uint256 _nonce) {
require(allowDelegate);
require(_from != 0x0);
require(_claimedReward <= _maxReward);
require(!usedNonce[_from][_nonce]);
usedNonce[_from][_nonce] = true;
require(_transfer(_from, msg.sender, _claimedReward));
_;
}// SignatureCheckerImpl.sol
function checkTransferDelegated(address _from,
address _to,
uint256 _value,
uint256 _maxReward,
uint256 _nonce,
bytes _signature)
public constant returns (bool) {
bytes32 hash = keccak256(transferDelegatedHash,
keccak256(msg.sender,
"transferDelegated",
_to,
_value,
_maxReward,
_nonce));
var (v, r, s) = _bytesToSignature(_signature);
return ecrecover(hash, v, r, s) == _from;
}

transfertransferDelegated 之間的唯一分別在於 signatureCheckercheckTrasnsferDelegated,以及 isDelegated 修飾器(modifier)。首先,我們以 transferDelegated 方法獲得你的簽署tovaluemaxRewardnoncecheckTransferDelegated 這個函數會使用 ecrecover 去檢查那些數據是否真的由你的地址所簽署。當我們確認這筆記錄真的由擁有人所簽署,我們會先從 _from (簽署方)減去 _claimReward 量的 LikeCoin,並加於 msg.sender (LikeCoin 基金會,作為受託者)作為交易費用。然後,直接執行 _transfer_from 轉賬到 _to

因此,委託者(你)可以就一筆付款委託指定付出最高的交易費用(_maxReward) ,而受託者 (在這個例子便是 LikeCoin 基金會)會負擔所需的以太幣交易費以在以太坊上執行這筆交易。也因此對委託者而言,他只需以 LikeCoin(ERC-20 代幣) 支付交易費用。

咦,但你使用 like.co 的點對點轉賬服務時,好像從來沒有支付過 LikeCoin 作為交易費用啊?當然了,因為我們把 _maxReward 設定了為 0 嘛。

(本文英文原文作者為 Aludirk,由 Edmond Yu 譯)

相關鏈結: 以太坊代幣付款委託 | Make it pay | Introduction to LikeChain | English version