ERC-20 வில்லை தரநிலை
அறிமுகம்
வில்லை என்றால் என்ன?
எத்திரியத்தில் வில்லைகள் எதை வேண்டுமானாலும் குறிக்கலாம்:
- இணையத் தளத்தில் உள்ள நற்பெயர் புள்ளிகள்
- விளையாட்டில் உள்ள ஒரு கதாபாத்திரத்தின் திறன்கள்
- ஒரு நிறுவனத்தின் பங்கு போன்ற நிதிச் சொத்துகள்
- USD போன்ற ஃபியட் நாணயம்
- ஒரு அவுன்ஸ் தங்கம்
- மற்றும் பல...
எத்திரியத்தின் இத்தகைய சக்திவாய்ந்த அம்சம் ஒரு வலுவான தரநிலையால் கையாளப்பட வேண்டும், இல்லையா? அங்குதான் ERC-20 தனது பங்கை வகிக்கிறது! இந்தத் தரநிலை, பிற தயாரிப்புகள் மற்றும் சேவைகளுடன் இயங்குதன்மையுள்ள வில்லை பயன்பாடுகளை உருவாக்க உருவாக்குநர்களை அனுமதிக்கிறது. கூடுதல் செயல்பாட்டை வழங்கவும் ERC-20 தரநிலை பயன்படுத்தப்படுகிறது.
ERC-20 என்றால் என்ன?
ERC-20 பரிமாற்றத்தக்க வில்லைகளுக்கான (Fungible Tokens) ஒரு தரநிலையை அறிமுகப்படுத்துகிறது, வேறுவிதமாகக் கூறினால், ஒவ்வொரு வில்லையும் மற்றொரு வில்லைக்கு (வகை மற்றும் மதிப்பில்) சரியாக ஒரே மாதிரியாக இருக்கும் பண்பைக் கொண்டுள்ளன. எடுத்துக்காட்டாக, ஒரு ERC-20 வில்லை ETH போலவே செயல்படுகிறது, அதாவது 1 வில்லை எப்போதும் மற்ற அனைத்து வில்லைகளுக்கும் சமமாக இருக்கும்.
முன்நிபந்தனைகள்
உள்ளடக்கம்
நவம்பர் 2015 இல் ஃபேபியன் வோகல்ஸ்டெல்லரால் (Fabian Vogelsteller) முன்மொழியப்பட்ட ERC-20 (Ethereum Request for Comments 20) என்பது திறன் ஒப்பந்தங்களுக்குள் வில்லைகளுக்கான API-ஐச் செயல்படுத்தும் ஒரு வில்லை தரநிலையாகும்.
ERC-20 வழங்கும் எடுத்துக்காட்டு செயல்பாடுகள்:
- ஒரு கணக்கிலிருந்து மற்றொரு கணக்கிற்கு வில்லைகளைப் பரிமாற்றம் செய்தல்
- ஒரு கணக்கின் தற்போதைய வில்லை இருப்பைப் பெறுதல்
- பிணையத்தில் கிடைக்கும் வில்லையின் மொத்த விநியோகத்தைப் பெறுதல்
- ஒரு கணக்கிலிருந்து குறிப்பிட்ட அளவு வில்லையை மூன்றாம் தரப்பு கணக்கு செலவிடலாமா என்பதற்கு ஒப்புதல் அளித்தல்
ஒரு திறன் ஒப்பந்தம் பின்வரும் முறைகள் மற்றும் நிகழ்வுகளைச் செயல்படுத்தினால், அதை ERC-20 வில்லை ஒப்பந்தம் என்று அழைக்கலாம், மேலும் அது பயன்படுத்தப்பட்டவுடன், எத்திரியத்தில் உருவாக்கப்பட்ட வில்லைகளைக் கண்காணிக்கும் பொறுப்பை அது ஏற்கும்.
EIP-20 (opens in a new tab) இலிருந்து:
முறைகள்
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
நிகழ்வுகள்
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
எடுத்துக்காட்டுகள்
எத்திரியத்தில் உள்ள எந்தவொரு ERC-20 வில்லை ஒப்பந்தத்தையும் நாம் எளிதாக ஆய்வு செய்வதற்கு ஒரு தரநிலை எவ்வளவு முக்கியமானது என்பதைப் பார்ப்போம். எந்தவொரு ERC-20 வில்லைக்கும் ஒரு இடைமுகத்தை உருவாக்க நமக்கு ஒப்பந்தப் பயன்பாட்டு பைனரி இடைமுகம் (Contract Application Binary Interface - ABI) மட்டுமே தேவை. கீழே நீங்கள் காண்பது போல, இதைப் புரிந்துகொள்ள எளிதான எடுத்துக்காட்டாக மாற்ற, எளிமைப்படுத்தப்பட்ட ABI-ஐப் பயன்படுத்துவோம்.
Web3.py எடுத்துக்காட்டு
முதலில், நீங்கள் Web3.py (opens in a new tab) Python நிரலகத்தை நிறுவியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்:
pip install web3
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # பொதியப்பட்ட ஈதர் (WETH)
acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # யூனிஸ்வாப் V2: DAI 2
# இது ஒரு ERC-20 வில்லை ஒப்பந்தத்தின் எளிமையாக்கப்பட்ட ஒப்பந்த பயன்பாட்டு பைனரி இடைமுகம் (ABI) ஆகும்.
# இது balanceOf(address), decimals(), symbol() மற்றும் totalSupply() ஆகிய முறைகளை மட்டுமே வெளிப்படுத்தும்.
simplified_abi = [
{
'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
'name': 'balanceOf',
'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'decimals',
'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'symbol',
'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
},
{
'inputs': [],
'name': 'totalSupply',
'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
'stateMutability': 'view', 'type': 'function', 'constant': True
}
]
dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
symbol = dai_contract.functions.symbol().call()
decimals = dai_contract.functions.decimals().call()
totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
# DAI
print("===== %s =====" % symbol)
print("Total Supply:", totalSupply)
print("Addr Balance:", addr_balance)
weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
symbol = weth_contract.functions.symbol().call()
decimals = weth_contract.functions.decimals().call()
totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
# WETH
print("===== %s =====" % symbol)
print("Total Supply:", totalSupply)
print("Addr Balance:", addr_balance)
அறியப்பட்ட சிக்கல்கள்
ERC-20 வில்லை பெறுதல் சிக்கல்
06/20/2024 நிலவரப்படி, இந்தச் சிக்கலால் குறைந்தது $83,656,418 மதிப்பிலான ERC-20 வில்லைகள் இழக்கப்பட்டுள்ளன. கீழே பட்டியலிடப்பட்டுள்ளபடி தரநிலையின் மேல் கூடுதல் கட்டுப்பாடுகளை நீங்கள் செயல்படுத்தாவிட்டால், ஒரு தூய்மையான ERC-20 செயலாக்கம் இந்தச் சிக்கலுக்கு ஆளாக நேரிடும் என்பதை நினைவில் கொள்க.
ERC-20 வில்லைகளைக் கையாள வடிவமைக்கப்படாத ஒரு திறன் ஒப்பந்தத்திற்கு ERC-20 வில்லைகள் அனுப்பப்படும்போது, அந்த வில்லைகள் நிரந்தரமாக இழக்கப்படலாம். பெறும் ஒப்பந்தத்திற்கு உள்வரும் வில்லைகளை அடையாளம் காணவோ அல்லது பதிலளிக்கவோ செயல்பாடு இல்லாததாலும், உள்வரும் வில்லைகளைப் பற்றி பெறும் ஒப்பந்தத்திற்குத் தெரிவிக்க ERC-20 தரநிலையில் எந்த வழிமுறையும் இல்லாததாலும் இது நிகழ்கிறது. இந்தச் சிக்கல் உருவாகும் முக்கிய வழிகள்:
- வில்லை பரிமாற்ற வழிமுறை
- ERC-20 வில்லைகள் transfer அல்லது transferFrom செயல்பாடுகளைப் பயன்படுத்திப் பரிமாற்றம் செய்யப்படுகின்றன
- பயனர் இந்தச் செயல்பாடுகளைப் பயன்படுத்தி ஒரு ஒப்பந்த முகவரிக்கு வில்லைகளை அனுப்பும்போது, பெறும் ஒப்பந்தம் அவற்றைக் கையாள வடிவமைக்கப்பட்டுள்ளதா என்பதைப் பொருட்படுத்தாமல் வில்லைகள் பரிமாற்றம் செய்யப்படுகின்றன
- அறிவிப்பு இல்லாமை
- பெறும் ஒப்பந்தத்திற்கு வில்லைகள் அனுப்பப்பட்டுள்ளன என்ற அறிவிப்போ அல்லது திரும்ப அழைப்போ (callback) கிடைப்பதில்லை
- பெறும் ஒப்பந்தத்தில் வில்லைகளைக் கையாளும் வழிமுறை (எ.கா., ஒரு பின்னடைவுச் செயல்பாடு அல்லது வில்லை பெறுதலை நிர்வகிக்க ஒரு பிரத்யேகச் செயல்பாடு) இல்லையென்றால், வில்லைகள் ஒப்பந்தத்தின் முகவரியில் சிக்கிக்கொள்ளும்
- உள்ளமைக்கப்பட்ட கையாளுதல் இல்லாமை
- ERC-20 தரநிலையானது பெறும் ஒப்பந்தங்கள் செயல்படுத்துவதற்கான கட்டாயச் செயல்பாட்டை உள்ளடக்கவில்லை, இதனால் பல ஒப்பந்தங்கள் உள்வரும் வில்லைகளைச் சரியாக நிர்வகிக்க முடியாத நிலை ஏற்படுகிறது
சாத்தியமான தீர்வுகள்
ERC-20 மூலம் இந்தச் சிக்கலை முழுமையாகத் தடுக்க முடியாது என்றாலும், இறுதிப் பயனருக்கு வில்லைகள் இழக்கப்படுவதற்கான சாத்தியக்கூறுகளைக் கணிசமாகக் குறைக்க அனுமதிக்கும் முறைகள் உள்ளன:
- பயனர் வில்லைகளை வில்லை ஒப்பந்த முகவரிக்கே அனுப்பும்போது (எ.கா., USDT வில்லை ஒப்பந்தத்தின் முகவரியில் USDT டெபாசிட் செய்யப்படுவது) மிகவும் பொதுவான சிக்கல் ஏற்படுகிறது. இத்தகைய பரிமாற்ற முயற்சிகளை மீளமை செய்ய
transfer(..)செயல்பாட்டைக் கட்டுப்படுத்தப் பரிந்துரைக்கப்படுகிறது.transfer(..)செயல்பாட்டின் செயலாக்கத்திற்குள்require(_to != address(this));சரிபார்ப்பைச் சேர்ப்பதைக் கருத்தில் கொள்க. - பொதுவாக
transfer(..)செயல்பாடு ஒப்பந்தங்களில் வில்லைகளை டெபாசிட் செய்ய வடிவமைக்கப்படவில்லை. அதற்குப் பதிலாக ஒப்பந்தங்களில் ERC-20 வில்லைகளை டெபாசிட் செய்யapprove(..) & transferFrom(..)முறை பயன்படுத்தப்படுகிறது. எந்தவொரு ஒப்பந்தத்திலும் வில்லைகளை டெபாசிட் செய்வதை அனுமதிக்காதபடி பரிமாற்றச் செயல்பாட்டைக் கட்டுப்படுத்த முடியும், இருப்பினும் இதுtransfer(..)செயல்பாட்டைக் கொண்டு ஒப்பந்தங்களில் வில்லைகளை டெபாசிட் செய்யலாம் என்று கருதும் ஒப்பந்தங்களுடனான (எ.கா., யூனிஸ்வாப் நீர்மைத்தன்மை குளங்கள்) இணக்கத்தன்மையை உடைக்கக்கூடும். - உங்கள் ஒப்பந்தம் எதையும் பெறக்கூடாது என்றாலும், ERC-20 வில்லைகள் உங்கள் ஒப்பந்தத்தில் வந்து சேரலாம் என்று எப்போதும் கருதுங்கள். பெறுநரின் முனையில் தற்செயலான டெபாசிட்டுகளைத் தடுக்கவோ அல்லது நிராகரிக்கவோ எந்த வழியும் இல்லை. தற்செயலாக டெபாசிட் செய்யப்பட்ட ERC-20 வில்லைகளைப் பிரித்தெடுக்க அனுமதிக்கும் ஒரு செயல்பாட்டைச் செயல்படுத்தப் பரிந்துரைக்கப்படுகிறது.
- மாற்று வில்லை தரநிலைகளைப் பயன்படுத்துவதைக் கருத்தில் கொள்க.
இந்தச் சிக்கலிலிருந்து ERC-223 அல்லது ERC-1363 போன்ற சில மாற்றுத் தரநிலைகள் வெளிவந்துள்ளன.
மேலும் படிக்க
- EIP-20: ERC-20 வில்லை தரநிலை (opens in a new tab)
- ஓப்பன்செப்பெலின் - வில்லைகள் (opens in a new tab)
- ஓப்பன்செப்பெலின் - ERC-20 செயலாக்கம் (opens in a new tab)
- Alchemy - Solidity ERC20 வில்லைகளுக்கான வழிகாட்டி (opens in a new tab)
பிற பரிமாற்றத்தக்க வில்லை தரநிலைகள்
பயிற்சிகள்: எத்திரியத்தில் ERC-20 உடன் உருவாக்குதல்
- ERC-20 ஒப்பந்த வழிகாட்டி – ஓப்பன்செப்பெலின் ERC-20 ஒப்பந்தச் செயலாக்கத்தின் வரிக்கு வரி விளக்கமளிக்கப்பட்ட வழிகாட்டி.
- பாதுகாப்பு வளையங்களுடன் ERC-20 – பயனர்கள் பொதுவான தவறுகளைத் தவிர்க்க உதவ, ERC-20 வில்லைகளில் பாதுகாப்புகளை எவ்வாறு சேர்ப்பது.
- Ethers.js ஐப் பயன்படுத்தி வில்லைகளை அனுப்புதல் – Ethers.js ஐப் பயன்படுத்தி ERC-20 வில்லைகளைப் பரிமாற்றம் செய்வதற்கான தொடக்கநிலையாளர்களுக்கான வழிகாட்டி.
- மோசடி வில்லைகளால் பயன்படுத்தப்படும் சில தந்திரங்கள் மற்றும் அவற்றைக் கண்டறிவது எப்படி – மோசடியான ERC-20 வில்லை வடிவங்கள் மற்றும் அவற்றை எவ்வாறு அடையாளம் காண்பது என்பது பற்றிய விரிவான பார்வை.