Ruka kwenda kwenye maudhui makuu
Change page

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

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 yote

Sasa 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 override
6 {
7 // Ni muhimu kuelewa kwamba ndani ya utendakazi huu
8 // 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 yote

Maswali 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 override
6 {
7 require(msg.sender == tokenA);
8 address(this).call(_data); // Shikilia muamala unaoingia na ufanye wito wa utendakazi unaofuata.
9 }
10 function foo() public
11 {
12 emit Foo();
13 }
14 function bar(uint256 _someNumber) public
15 {
16 emit Bar(_someNumber);
17 }
18}
Onyesha yote

Wakati 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.

Masomo zaidi

Je! makala haya yamekusaidia?