ERC-223 ishara kiwango
Ukurasa ulihaririwa mwisho: 6 Septemba 2025
Utangulizi
ERC-223 ni nini?
ERC-223 ni kiwango kwa ishara badilisha, sawa na kiwango ERC-20. Tofauti kuu ni kwamba ERC-223 hufafanua si tu ishara API lakini pia hoja kwa ajili ya kuhamisha ishara kutoka wa tuma kwa mpokeaji. Anzisha mfano wa mawasiliano ambayo kuruhusu uhamisho wa ishara shughulika kwa upande wa mpokeaji.
Tofauti kutoka ERC-20
ERC-223 shughulika baadhi ya mapungufu ya ERC-20 na kuanzisha njia mpya ya mwingiliano kati ya mkataba ishara na mkataba ambayo inaweza kupokea ishara. Kuna jambo machache ambayo inawezekana na ERC-223 lakini si na ERC-20:
- Usimamizi wa uhamisho wa ishara kwa upande wa mpokeaji: Wapokeaji wanaweza kugundua kuwa ishara ya ERC-223 imewekwa.
- Kukataliwa kwa ishara vibaya walio tuma: Ikiwa mtumiaji tuma ishara za ERC-223 kwa mkataba ambao hakuna kupokea ishara, mkataba unaweza kukataa shughuli hiyo, kuzuia kupoteza wa ishara.
- Metadata katika uhamisho: ERC-223 ishara inaweza ni pamoja na metadata, kuruhusu taarifa arbitrary kuwa masharti ya ishara shughuli.
Mahitaji ya awali
- Hifadhi ya fedha (/developers/docs/accounts)
- Mkataba erevu
- Viwango vya tokeni
- ERC-20
Mwili
ERC-223 ni ishara ya kiwango ambacho kutekeleza API kwa ishara ndani ya mikataba erevu. Pia kutangaza API kwa ajili ya mikataba ambayo kuhitaji kupokea ERC-223 ishara. Mikataba ambayo haina msaada ERC-223 mpokeaji API haiwezi kupokea ERC-223 ishara, kuzuia makosa ya mtumiaji.
Kama mkataba erevu kutekeleza mbinu kufuatia na matukio inaweza kuitwa ERC-223 sambamba ishara mkataba. Mara kupelekwa, ni itakuwa na jukumu la kufuatilia ishara iliyoundwa kwenye Ethereum.
Mkataba si wajibu wa kuwa na kazi hizi tu na muumba unaweza kuongeza kipengele kingine chochote kutoka viwango vya ishara tofauti na mkataba huu. Kwa mfano, kubali na kuhamisha Kutoka kazi si sehemu ya kiwango ERC-223 lakini kazi hizi inaweza kutekelezwa kama ni lazima.
Kutoka EIP-223opens in a new tab:
Mbinu
ERC-223 ishara lazima kutekeleza mbinu kufuatia:
1function name() public view returns (string)2function symbol() public view returns (string)3function decimals() public view returns (uint8)4function totalSupply() public view returns (uint256)5function balanceOf(address _owner) public view returns (uint256 balance)6function transfer(address _to, uint256 _value) public returns (bool success)7function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success)Mkataba ambayo inadhaniwa kupokea ERC-223 ishara lazima kutekeleza mbinu kufuatia:
1function tokenReceived(address _from, uint _value, bytes calldata _data)Kama ERC-223 ishara ni alimtuma kwa mkataba kwamba haina kutekeleza ishara pokewa(..) kazi basi uhamisho lazima kushindwa na ishara lazima si kuhamisha kutoka usawa wa alio tuma.
Matukio
1event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data)Mfano
API ya ERC-223 ishara ni sawa na ile ya ERC-20, hivyo kutoka UI maendeleo mtazamo hakuna tofauti. Tofauti pekee hapa ni kwamba ERC-223 ishara haiwezi kuwa na 'kubali' + 'uhamisho kutoka' kazi kama haya ni hiari kwa ajili ya kiwango hiki.
Mifano ya Solidity
Mfano ufuatao unaonyesha jinsi ya msingi ERC-223 ishara mkataba kazi:
1pragma solidity ^0.8.19;2abstract contract IERC223Recipient {3 function tokenReceived(address _from, uint _value, bytes memory _data) public virtual;4}5contract VeryBasicERC223Token {6 event Transfer(address indexed from, address indexed to, uint value, bytes data);7 string private _name;8 string private _symbol;9 uint8 private _decimals;10 uint256 private _totalSupply;11 mapping(address => uint256) private balances;12 function name() public view returns (string memory) { return _name; }13 function symbol() public view returns (string memory) {return _symbol; }14 function decimals() public view returns (uint8) { return _decimals; }15 function totalSupply() public view returns (uint256) { return _totalSupply; }16 function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; }17 function isContract(address account) internal view returns (bool) {18 uint256 size;19 assembly { size := extcodesize(account) }20 return size > 0;21 }22 function transfer(address _to, uint _value, bytes calldata _data) public returns (bool success){23 balances[msg.sender] = balances[msg.sender] - _value;24 balances[_to] = balances[_to] + _value;25 if(isContract(_to)) {26 IERC223Recipient(_to).tokenReceived(msg.sender, _value, _data);27 }28 emit Transfer(msg.sender, _to, _value, _data);29 return true;30 }31 function transfer(address _to, uint _value) public returns (bool success){32 bytes memory _empty = hex"00000000";33 balances[msg.sender] = balances[msg.sender] - _value;34 balances[_to] = balances[_to] + _value;35 if(isContract(_to)) {36 IERC223Recipient(_to).tokenReceived(msg.sender, _value, _empty);37 }38 emit Transfer(msg.sender, _to, _value, _empty);39 return true;40 }41}Onyesha yoteSasa tunataka mkataba mwingine kukubali amana ya ishara ya A kwa kudhani kwamba ishara ya A ni ishara ya ERC-223. Mkataba lazima kukubali tu ishara A na kukataa ishara nyingine yoyote. Wakati mkataba anapata ishara A ni lazima kutoa tukio la 'amana()' na kuongeza thamani ya ndani 'amana' kutofautiana.
Hapa ni nambari:
1contract RecipientContract is IERC223Recipient {2 event Deposit(address whoSentTheTokens);3 uint256 deposits = 0;4 address tokenA; // Tokeni pekee tunayotaka kukubali.5 function tokenReceived(address _from, uint _value, bytes memory _data) public override6 {7 // Ni muhimu kuelewa kwamba ndani ya utendakazi huu8 // msg.sender ni anwani ya tokeni inayopokewa,9 // msg.value daima ni 0 kwa vile mkataba wa tokeni haumiliki wala kutuma ether katika hali nyingi,10 // _from ni mtumaji wa uhamishaji wa tokeni,11 // _value ni kiasi cha tokeni kilichowekwa.12 require(msg.sender == tokenA);13 deposits += _value;14 emit Deposit(_from);15 }16}Onyesha yoteMaswali yanayoulizwa mara kwa mara
Nini kutokea kama sisi tuma baadhi ya ishara B kwa mkataba?
Mkataba utashindwa, na uhamisho wa ishara hakuna kutokea. Ishara kurudi kwenye anwani ya aliye tuma.
Tunaweza aje kuweka amana kwa mkataba huu?
Wito uhamisho (anwani,uint256) au uhamisho (anwani,uint256,bytes) kazi ya ERC-223 ishara, kutaja anwani ya Mpokeaji Mkataba.
Nini kutokea kama sisi kuhamisha ERC-20 ishara ya mkataba huu?
Kama ishara ERC-20 ni alimtuma kwa Mpokeaji mkataba, ishara itakuwa na uhamisho, lakini uhamisho itakuwa si kujulikana (hakuna amana() tukio itakuwa ya kutolewa, na amana thamani hakuna badiliko). Hakuna kwenye ERC-20 amana haiwezi kuchuja au kuzuia.
Nini kama tunataka kutekeleza baadhi ya kazi baada ya amana ishara ni kukamilika?
Kuna njia nyingi za kufanya hivyo. Katika mfano huu kufuata njia ambayo kufanya ERC-223 uhamisho sawa na uhamisho Ether:
1contract RecipientContract is IERC223Recipient {2 event Foo();3 event Bar(uint256 someNumber);4 address tokenA; // Tokeni pekee tunayotaka kukubali.5 function tokenReceived(address _from, uint _value, bytes memory _data) public override6 {7 require(msg.sender == tokenA);8 address(this).call(_data); // Shikilia muamala unaoingia na ufanye wito wa utendakazi unaofuata.9 }10 function foo() public11 {12 emit Foo();13 }14 function bar(uint256 _someNumber) public15 {16 emit Bar(_someNumber);17 }18}Onyesha yoteWakati Mpokeaji Mkataba atapokea ERC-223 ishara ya mkataba elekez kazi mwandiko wa fumbo kama _takwimukigezo ya shughuli ishara, sawa na jinsi shughuli Ether kanuni wito kazi kama shughuli takwimu. Soma sehemu ya data kwa habari zaidi.
Katika mfano hapo juu ERC-223 ishara lazima uhamisho kwa anwani ya Mpokeaji Mkataba na uhamisho(anwani,uin256,bytes wito takwimu _takwimu) kazi. Kama takwimu kigezo itakuwa 0xc2985578 (saini ya foo() kazi) basi kazi foo() itaitwa baada ya amana ishara ni kupokea na tukio Foo() itakuwa kuacha.
Vigezo inaweza mwandiko wa fumbo katika takwimu ya uhamisho ishara kama, kwa mfano tunaweza wito bar () kazi na 12345 thamani kwa _baadhi Idadi . Katika kesi hii takwimu lazima
0x0423a13200000000000000000000000000000000000000000000000000000000000004d2' ambapo '0x0423a132 ni saini ya kazi ya bar(uint256) na 00000000000000000000000000000000000000000000000000000000000004d2 ni 12345 kama uint256.
Vizuizi
Wakati ERC-223 kushughulikia suala kadhaa kupatikana katika kiwango ERC-20, ni si bila mapungufu yake mwenyewe:
- Kupitishwa na tangamano: ERC-223 bado haijatumiwa sana, ambayo inaweza kupunguza tangamano wao na zana na majukwaa yaliyomo.
- Nyuma tangamano: ERC-223 si nyuma sambamba na ERC-20, maana yake ni kwamba kuwa ERC-20 mikataba na zana si kazi na ERC-223 ishara bila marekebisho.
- Gharama za gesi: ukaguzi wa ziada na utendaji katika uhamisho wa ERC-223 unaweza kusababisha gharama za juu za gesi ikilinganishwa na shughuli za ERC-20.