가스를 사용하지 않고 토큰을 지갑 잔액으로 스트리밍
5937 단어 web3solidityethereumblockchain
일반적인 토큰 전송
일반적인 시나리오에서 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
Reference
이 문제에 관하여(가스를 사용하지 않고 토큰을 지갑 잔액으로 스트리밍), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nikoferro/streaming-tokens-into-a-wallet-balance-without-spending-gas-2e8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)