라이크코인 전송 수수료 위임 (transferDelegated)
ERC-20 토큰을 전송 수수료로 사용하다.
라이크코인의 홈페이지 like.co에서 송금을 시도해보셨다면 ERC-20 토큰인 라이크코인이 왜 이더리움 전송 수수료 같이 수수료를 내지 않아도 되는지에 대하여 궁금점을 가지셨었을 거라 생각 합니다.
일반적인 ERC-20 토큰의 전송은 메타마스크를 사용할 수 있죠.
위 예제와 같이 송금을 하기 위해서는 0.0011252 ETH를 수수료로 내야 한다는 것도 이해 하시겠죠.
그러면 스마트 컨트랙트 상에서 일반적인 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를 저에게 보내게 된다면 아래와 같은 화면을 보시게 됩니다.
승인을 누르고 나서 해야할 일은 메타마스크에서 사인을 해주고 바로 100LIKE가 제 이더리움 지갑 주소로 아무런 송금 수수료 없이 보내지게 됩니다.
그러면 위에서 언급하였던 송금 위임(transferDelegated)이 스마트 컨트랙트 상에서 어떠한 마법을 부렸는지 볼까요?
// 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;
}
일반적으로 사용하는 송금(transfer)과 송금 위임(transferDelegated)의 다른점이라 하면 signatureChecker상에서의 checkTransferDelegated와 연계 수식인 isDelegated 입니다. 첫번째로 사인 요청을 transferDelegated라는 명칭의 방법으로 사인을 받죠. to, value, maxReward 그리고 nonce가 해당 됩니다. checkTransferDelegated를 사용하여 이 데이터들이 ecrecover을 통하여 사인을 하는 것인지 확인 하는 작업을 거치게 됩니다. 이 송금이 유효하다는 것을 사용자에게 확인을 받게 되면 첫번째로 _claimedReward를 총 수량의 라이크코인을 통하여 _from 에서 msg.sender (이 경우 라이크코인 재단이 위임자가 됩니다.)에게 보내게 됩니다. 이후 일반 _transfer를 _from에서 _to로 처리 합니다.
그렇기 때문에 위임지정자(사용자님이겠죠)가 최대의 송금 수수료(`_maxReward`)를 직접 지불하지 않고 송금 위임을 통하여 라이크코인 재단이 직접 이더리움 수수료를 이더리움 네트워크에서 지불하여 전송을 하게 됩니다. 그렇게 하기 때문에 위임지정자인 사용자들은 자신들의 라이크코인을 라이크코인(ERC-20 토큰)하나로만 송금을 할 수 있게 되는거죠.
그래서 like.co 홈페이지를 통하여 송금을 하기 때문에 직접적인 수수료의 부담 없이 송금을 해낼 수 있습니다. 이러한 이유는 당연하게 저희가 _maxReward를 0으로 설정하였기 때문이죠.
관련 링크: 以太坊代幣付款委託(Cantonese speech) | Make it pay | Introduction to LikeChain | Chinese version