ERC-1155 பல-வில்லை தரநிலை
அறிமுகம்
பல வில்லை வகைகளை நிர்வகிக்கும் ஒப்பந்தங்களுக்கான ஒரு நிலையான இடைமுகம். பயன்படுத்தப்பட்ட ஒரு ஒற்றை ஒப்பந்தத்தில் பரிமாற்றத்தக்க வில்லைகள், பரிமாற்றத்தகாத வில்லைகள் அல்லது பிற உள்ளமைவுகளின் (எ.கா., பாதி-பரிமாற்றத்தக்க வில்லைகள்) எந்தவொரு கலவையும் இருக்கலாம்.
பல-வில்லை தரநிலை என்றால் என்ன?
இந்த யோசனை எளிமையானது மற்றும் எந்தவொரு எண்ணிக்கையிலான பரிமாற்றத்தக்க மற்றும் பரிமாற்றத்தகாத வில்லை வகைகளையும் பிரதிநிதித்துவப்படுத்தவும் கட்டுப்படுத்தவும் கூடிய ஒரு திறன் ஒப்பந்த இடைமுகத்தை உருவாக்குவதை நோக்கமாகக் கொண்டுள்ளது. இதன் மூலம், ERC-1155 வில்லையானது ERC-20 மற்றும் ERC-721 வில்லைகளின் அதே செயல்பாடுகளைச் செய்ய முடியும், மேலும் இரண்டையும் ஒரே நேரத்திலும் செய்ய முடியும். இது ERC-20 மற்றும் ERC-721 தரநிலைகள் இரண்டின் செயல்பாட்டையும் மேம்படுத்துகிறது, மேலும் இதை மிகவும் திறமையானதாக்குகிறது மற்றும் வெளிப்படையான செயலாக்கப் பிழைகளைச் சரிசெய்கிறது.
ERC-1155 வில்லை EIP-1155 (opens in a new tab) இல் முழுமையாக விவரிக்கப்பட்டுள்ளது.
முன்நிபந்தனைகள்
இந்தப் பக்கத்தை நன்கு புரிந்துகொள்ள, முதலில் வில்லை தரநிலைகள், ERC-20 மற்றும் ERC-721 பற்றிப் படிக்குமாறு பரிந்துரைக்கிறோம்.
ERC-1155 செயல்பாடுகள் மற்றும் அம்சங்கள்:
- தொகுப்பு பரிமாற்றம் (Batch Transfer): ஒரே அழைப்பில் பல சொத்துகளைப் பரிமாற்றம் செய்யலாம்.
- தொகுப்பு இருப்பு (Batch Balance): ஒரே அழைப்பில் பல சொத்துகளின் இருப்புகளைப் பெறலாம்.
- தொகுப்பு ஒப்புதல் (Batch Approval): ஒரு முகவரிக்கு அனைத்து வில்லைகளையும் ஒப்புதல் அளிக்கலாம்.
- கொக்கிகள் (Hooks): வில்லைகளைப் பெறும் கொக்கி.
- NFT ஆதரவு: வழங்கல் 1 ஆக மட்டுமே இருந்தால், அதை NFT ஆகக் கருதலாம்.
- பாதுகாப்பான பரிமாற்ற விதிகள்: பாதுகாப்பான பரிமாற்றத்திற்கான விதிகளின் தொகுப்பு.
தொகுப்பு பரிமாற்றங்கள்
தொகுப்பு பரிமாற்றம் வழக்கமான ERC-20 பரிமாற்றங்களைப் போலவே செயல்படுகிறது. வழக்கமான ERC-20 transferFrom செயல்பாட்டைப் பார்ப்போம்:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
ERC-1155 இல் உள்ள ஒரே வித்தியாசம் என்னவென்றால், மதிப்புகளை ஒரு வரிசையாக (array) அனுப்புகிறோம், மேலும் ஐடிகளின் (ids) வரிசையையும் அனுப்புகிறோம். எடுத்துக்காட்டாக, ids=[3, 6, 13] மற்றும் values=[100, 200, 5] கொடுக்கப்பட்டால், இதன் விளைவாக வரும் பரிமாற்றங்கள் பின்வருமாறு இருக்கும்:
_fromஇலிருந்து_toக்கு ஐடி 3 கொண்ட 100 வில்லைகளைப் பரிமாற்றம் செய்தல்._fromஇலிருந்து_toக்கு ஐடி 6 கொண்ட 200 வில்லைகளைப் பரிமாற்றம் செய்தல்._fromஇலிருந்து_toக்கு ஐடி 13 கொண்ட 5 வில்லைகளைப் பரிமாற்றம் செய்தல்.
ERC-1155 இல் transferFrom மட்டுமே உள்ளது, transfer இல்லை. இதை வழக்கமான transfer போலப் பயன்படுத்த, செயல்பாட்டை அழைக்கும் முகவரிக்கு from முகவரியை அமைத்தால் போதும்.
தொகுப்பு இருப்பு
அந்தந்த ERC-20 balanceOf அழைப்பானது தொகுப்பு ஆதரவுடன் அதன் கூட்டாளர் செயல்பாட்டைக் கொண்டுள்ளது. நினைவூட்டலாக, இது ERC-20 பதிப்பு:
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
இருப்பு அழைப்பிற்கு இன்னும் எளிமையாக, ஒரே அழைப்பில் பல இருப்புகளை நாம் மீட்டெடுக்கலாம். உரிமையாளர்களின் வரிசையைத் தொடர்ந்து, வில்லை ஐடிகளின் வரிசையை அனுப்புகிறோம்.
எடுத்துக்காட்டாக, _ids=[3, 6, 13] மற்றும் _owners=[0xbeef..., 0x1337..., 0x1111...] கொடுக்கப்பட்டால், திரும்பப் பெறும் மதிப்பு பின்வருமாறு இருக்கும்:
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
தொகுப்பு ஒப்புதல்
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
ஒப்புதல்கள் ERC-20 ஐ விடச் சற்று வித்தியாசமானவை. குறிப்பிட்ட தொகைகளுக்கு ஒப்புதல் அளிப்பதற்குப் பதிலாக, setApprovalForAll மூலம் ஒரு ஆபரேட்டரை ஒப்புதல் அளிக்கப்பட்டதாகவோ அல்லது ஒப்புதல் அளிக்கப்படாததாகவோ அமைக்கிறீர்கள்.
தற்போதைய நிலையை isApprovedForAll மூலம் படிக்கலாம். நீங்கள் பார்ப்பது போல், இது ஒரு அனைத்தும்-அல்லது-எதுவுமில்லை (all-or-nothing) செயல்பாடாகும். எத்தனை வில்லைகளுக்கு ஒப்புதல் அளிக்க வேண்டும் அல்லது எந்த வில்லை வகுப்பு என்பதை உங்களால் வரையறுக்க முடியாது.
இது எளிமையைக் கருத்தில் கொண்டு வேண்டுமென்றே வடிவமைக்கப்பட்டுள்ளது. ஒரு முகவரிக்கு அனைத்தையும் மட்டுமே உங்களால் ஒப்புதல் அளிக்க முடியும்.
பெறும் கொக்கி (Receive Hook)
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
EIP-165 (opens in a new tab) ஆதரவு கொடுக்கப்பட்டுள்ளதால், ERC-1155 திறன் ஒப்பந்தங்களுக்கு மட்டுமே பெறும் கொக்கிகளை ஆதரிக்கிறது. கொக்கி செயல்பாடு ஒரு மேஜிக் முன்வரையறுக்கப்பட்ட bytes4 மதிப்பை வழங்க வேண்டும், அது பின்வருமாறு கொடுக்கப்பட்டுள்ளது:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
பெறும் ஒப்பந்தம் இந்த மதிப்பை வழங்கும்போது, ஒப்பந்தம் பரிமாற்றத்தை ஏற்றுக்கொள்கிறது மற்றும் ERC-1155 வில்லைகளை எப்படிக் கையாள்வது என்பதை அறிந்திருக்கிறது என்று கருதப்படுகிறது. அருமை, இனி ஒரு ஒப்பந்தத்தில் வில்லைகள் சிக்கிக்கொள்ளாது!
NFT ஆதரவு
வழங்கல் ஒன்றாக மட்டுமே இருக்கும்போது, வில்லை அடிப்படையில் ஒரு பரிமாற்றத்தகாத வில்லை (NFT) ஆகும். மேலும் ERC-721 க்கான தரநிலையைப் போலவே, நீங்கள் ஒரு மீத்தரவு URL ஐ வரையறுக்கலாம். URL ஐ வாடிக்கையாளர்களால் படிக்கவும் மாற்றவும் முடியும், இங்கே (opens in a new tab) பார்க்கவும்.
பாதுகாப்பான பரிமாற்ற விதி
முந்தைய விளக்கங்களில் சில பாதுகாப்பான பரிமாற்ற விதிகளைப் பற்றி ஏற்கனவே பார்த்தோம். ஆனால் விதிகளில் மிக முக்கியமானவற்றைப் பார்ப்போம்:
- அழைப்பாளர்
_fromமுகவரிக்கான வில்லைகளைச் செலவிட ஒப்புதல் பெற்றிருக்க வேண்டும் அல்லது அழைப்பாளர்_fromக்குச் சமமாக இருக்க வேண்டும். - பின்வரும் நிலைகளில் பரிமாற்ற அழைப்பு மீளமைக்கப்பட வேண்டும்:
_toமுகவரி 0 ஆக இருந்தால்._idsஇன் நீளம்_valuesஇன் நீளத்திற்குச் சமமாக இல்லை என்றால்._idsஇல் உள்ள வில்லை(களுக்கான) வைத்திருப்பவர்(களின்) இருப்பு(கள்) பெறுநருக்கு அனுப்பப்பட்ட_valuesஇல் உள்ள அந்தந்த தொகை(களை) விடக் குறைவாக இருந்தால்.- வேறு ஏதேனும் பிழை ஏற்பட்டால்.
குறிப்பு: கொக்கி உட்பட அனைத்துத் தொகுப்புச் செயல்பாடுகளும் தொகுப்பு இல்லாத பதிப்புகளாகவும் உள்ளன. ஒரே ஒரு சொத்தை மட்டும் பரிமாற்றம் செய்வது இன்னும் பொதுவாகப் பயன்படுத்தப்படும் வழியாக இருக்கும் என்பதைக் கருத்தில் கொண்டு, எரிவாயு திறனுக்காக இது செய்யப்படுகிறது. பாதுகாப்பான பரிமாற்ற விதிகள் உட்பட, விளக்கங்களில் எளிமைக்காக அவற்றை நாங்கள் விட்டுவிட்டோம். பெயர்கள் ஒரே மாதிரியானவை, 'Batch' என்பதை மட்டும் நீக்கிவிடவும்.