가스를 사용하지 않고 토큰을 지갑 잔액으로 스트리밍

Proof of Humanity(Ethereum의 인간을 위한 사회적 신원 확인 시스템)과 UBI 토큰에 대해 처음 들었을 때 프로젝트의 박애주의적 성격을 제외하고 내 관심을 끈 것은 프로젝트가 매우 영리한 기술을 사용하여 검증된 인간에게 보편적 기본 소득(UBI) 토큰. 이 게시물은 이 프로젝트에서 영감을 받아 가스를 전혀 사용하지 않고 토큰을 실시간으로 다른 주소로 스트리밍하는 방법을 설명하는 것을 목표로 합니다.

일반적인 토큰 전송



일반적인 시나리오에서 ERC20 표준을 사용하는 토큰은 발행되어 주소로 전송될 수 있습니다. 이 전송이 실제로 수행하는 작업은 다음과 같은 매핑을 사용하여 주소에 있는 토큰 수를 추적하는 것입니다.

mapping(address => uint256) private balances


이 매핑을 편집하면 계약 상태가 변경되며 트랜잭션이 포함되므로 가스 비용이 발생합니다.

동일한 표준에 따라 저울 매핑에서 읽기는 balanceOf(address account) 기능을 사용하여 수행됩니다. 읽기는 계약의 상태를 변경하지 않으므로 이 함수 호출은 비용이 들지 않습니다.
이는 토큰 드립핑/스트리밍 이면의 기술을 이해하는 데 중요합니다.

지갑에 토큰 떨어뜨리기



이제 Y 시간마다 X 양의 토큰을 전송해야 한다고 가정해 보겠습니다. 이전에 설명한 정기적인 접근 방식을 사용하면 각 전송마다 정기적으로 가스를 소비하는 반복 전송이 포함됩니다.

이 시나리오는 시간 의존적이기 때문에 우리는 실제로 경과된 시간을 추적하고 잔액 매핑에서 실제로 추적하지 않고 해당 주소에 속하는 토큰 수를 즉석에서 계산할 수 있습니다(이에 대한 가스 소비를 절약함).

하지만 스트리밍은 어디에 있습니까?

상호 운용성을 보장하기 위한 인터페이스로 ERC20 표준이 있기 때문에 우리가 사용하는 지갑이나 소프트웨어가 주소 잔액을 얻기 위해 balanceOf 함수를 호출할 것이라고 믿을 수 있습니다.

이 경우 경과 시간을 추적하면서 잔액의 토큰 양을 즉석에서 계산하기 때문에 결과는 (다른 조건이 적용되지 않는 경우) 주소 잔액의 토큰 양이 증가합니다. 빠른 예로서, 이 게시물 당시 Metamask는 약 20초마다 확인balanceOf하여 20초마다 토큰 스트리밍/지갑으로 떨어지는 결과를 낳습니다.

그러나 경과 시간을 어떻게 추적합니까?
block.timestamp를 사용하여 현재 블록의 UNIX epoch에 실제로 액세스할 수 있으므로 토큰 드립에 등록된 블록과 현재 블록 간의 시간 차이를 실제로 추적할 수 있습니다. 여기에는 다음과 같은 간단한 코드가 포함됩니다.

mapping(address => uint256) private startTime;

function register() public {
    startTime[msg.sender] = block.timestamp;
}


실례



시작 시간이 등록되면(위의 코드에서와 같이) 지갑에서 호출할 함수balanceOf에서 경과 시간을 확인하기만 하면 됩니다. 매핑에 주소를 등록할 때 블록의 타임스탬프와 현재 블록의 타임스탬프 사이의 차이를 계산하고 그 차이를 우리가 할당하려는 토큰의 X 양에 곱하면 됩니다. 시각.

다음은 시간 의존적balanceOf 기능을 달성할 수 있는 방법에 대한 간단하지만 작동하는 예입니다.

uint256 private tokenPerSecond = 1;

function isRegistered(address account) public view returns (bool) {
    return startTime[account] != 0;
}

function balanceOf(address account) public view returns (uint256) {
    // if registered, return balance
    if (isRegistered(account)) {
        uint256 timeSinceStart = block.timestamp.sub(
            startTime[account],
            "Subtraction cannot overflow"
        );
        uint256 tokensInBalance = timeSinceStart.mul(tokenPerSecond);
        return tokensInBalance;
    }
    // if not registered, return 0
    return 0;
}


ERC20을 준수하면서 스트리밍에 대한 최종 참고 사항



앞의 예는 시간이 지남에 따라 누적된 토큰이 어떻게 전송될 수 있는지 또는 총 공급량이 무엇인지 보여주지 않기 때문에 ERC20을 완전히 준수하지 않습니다. 예를 들어 UBI tokens은 주소를 이동(전송 또는 소각)하기 전에 주소에서 UBI로 발행한 토큰을 고려하지 않습니다.

이 특정 예의 경우 유사한 전략을 따르는 솔루션이 그렇게 복잡하지는 않지만 두 번째 게시물이 필요합니다.

이 예제에 대한 전체 작업 코드는 여기에서 찾을 수 있습니다: https://github.com/nikoferro/drip-token

좋은 웹페이지 즐겨찾기