Téigh ar aghaidh chuig an bpríomhábhar
Change page

ERC-223 Caighdeán Chomhartha

Réamhrá

Cad é ERC-223?

Is caighdeán é ERC-223 le haghaidh comharthaí idirmhalartacha, cosúil leis an gcaighdeán ERC-20. Is í an phríomhdhifríocht ná go sainmhíníonn ERC-223 ní amháin API chomharthaí ach freisin an loighic chun comharthaí a aistriú ó sheoltóir go faighteoir. Tugann sé isteach múnla cumarsáide a cheadaíonn aistrithe chomharthaí a láimhseáil ar thaobh an fhaighteora.

Difríochtaí ó ERC-20

Tugann ERC-223 aghaidh ar roinnt srianta a bhaineann le ERC-20 agus tugtar isteach modh nua idirghníomhaíochta idir an conradh comhartha agus conradh a fhéadfaidh na comharthaí a fháil. Is beag rudaí indéanta le ERC-223 nach bhfuil indéanta le ERC-20:

  • Láimhseáil aistrithe comhartha ar thaobh an fhaighteora: Is féidir le faighteoirí a bhrath go bhfuil comhartha ERC-223 á thaisceadh.
  • Diúltú comharthaí seolta go míchuí: Má sheolann úsáideoir comharthaí ERC-223 chuig conradh nach bhfuil ceaptha chun comharthaí a fháil, is féidir leis an gconradh an t-idirbheart a dhiúltú, rud a chuireann cosc ​​ar chaillteanas chomharthaí.
  • Meiteashonraí in aistrithe: Is féidir meiteashonraí a áireamh le comharthaí ERC-223, rud a fhágann gur féidir faisnéis threallach a cheangal le hidirbhearta dearbhán.

Réamhriachtanais

Corp

Is caighdeán dearbhán é ERC-223 a chuireann API le haghaidh comharthaí i bhfeidhm laistigh de chonarthaí cliste. Dearbhaíonn sé freisin API le haghaidh conarthaí atá ceaptha chun comharthaí ERC-223 a fháil. Ní féidir le conarthaí nach dtacaíonn le API Glacadóir ERC-223 comharthaí ERC-223 a fháil, rud a chuireann cosc ​​ar earráid úsáideora.

Má chuireann conradh cliste na modhanna agus na himeachtaí seo a leanas i bhfeidhm is féidir conradh dearbhán comhoiriúnach ERC-223 a thabhairt air. Nuair a bheidh sé imscartha, beidh sé freagrach as súil a choinneáil ar na comharthaí cruthaithe ar Ethereum.

Níl aon oibleagáid ar an gconradh ach na feidhmeanna seo a bheith aige agus is féidir le forbróir aon ghné eile ó chaighdeáin chomharthaí éagsúla a chur leis an gconradh seo. Mar shampla, níl feidhmeanna ceadaigh agus transferFrom mar chuid de chaighdeán ERC-223 ach d'fhéadfaí na feidhmeanna seo a chur i bhfeidhm dá mbeadh gá leis.

Ó EIP-223(opens in a new tab):

Modhanna

Ní mór do chomhartha ERC-223 na modhanna seo a leanas a chur i bhfeidhm:

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)
Cóip

Caithfidh conradh atá ceaptha chun comharthaí ERC-223 a fháil an modh seo a leanas a chur i bhfeidhm:

1function tokenReceived(address _from, uint _value, bytes calldata _data)
Cóip

Má sheoltar comharthaí ERC-223 chuig conradh nach gcuireann an fheidhm tokenReceived(..) i bhfeidhm ní mór go dteipfidh ar an aistriú agus ní féidir na comharthaí a aistriú ó iarmhéid an tseoltóra.

Imeachtaí

1event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data)
Cóip

Samplaí

Tá an API de ERC-223 chomhartha cosúil leis an ERC-20, mar sin ó thaobh forbartha Chomhéadain níl aon difríocht ann. Is é an t-aon eisceacht anseo ná go bhféadfadh sé nach mbeadh feidhmeanna ceadaigh + transferFrom ag comharthaí ERC-223 mar go bhfuil siad seo roghnach don chaighdeán seo.

Samplaí soladacha

Léiríonn an sampla seo a leanas conas a fheidhmíonn bunchonradh dearbhán ERC-223:

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}
Taispeáin gach rud
Cóip

Anois teastaíonn conradh eile uainn chun glacadh le taiscí tokenA ag glacadh leis gur comhartha ERC-223 é tokenA. Ní mór don chonradh glacadh le tokenA amháin agus aon comharthaí eile a dhiúltú. Nuair a fhaigheann an conradh chomhartha, caithfidh sé imeacht Taiscigh() a astú agus luach na hathróige taiscí inmheánach a mhéadú.

Seo é an cód:

1contract RecipientContract is IERC223Recipient {
2 event Deposit(address whoSentTheTokens);
3 uint256 deposits = 0;
4 address tokenA; // An t-aon chomhartha gur mian linn glacadh leis.
5 function tokenReceived(address _from, uint _value, bytes memory _data) public override
6 {
7 // Tá sé tábhachtach é sin a thuiscint laistigh den fheidhm seo
8 // msg.sender seoladh dearbhán atá á fháil,
9 // msg.value is 0 i gcónaí toisc nach leis an gconradh chomharthaí ná nach seolann éitear i bhformhór na gcásanna,
10 // _from is é seoltóir an aistrithe chomhartha.
11 // _value is é an méid comharthaí a cuireadh i dtaisce.
12 require(msg.sender == tokenA);
13 deposits += _value;
14 emit Deposit(_from);
15 }
16}
Taispeáin gach rud
Cóip

Ceisteanna coitianta

Cad a tharlóidh má sheolaimid roinnt tokenB chuig an gconradh?

Teipfidh an t-idirbheart, agus ní tharlóidh aistriú comharthaí. Seolfar na comharthaí ar ais chuig seoladh an tseoltóra.

Conas is féidir linn taisce a dhéanamh sa chonradh seo?

Glaoigh ar an fheidhm transfer(address,uint256)transfer(address,uint256,bytes) den chomhartha ERC-223, ag sonrú seoladh an RecipientContract.

Cad a tharlóidh má aistrímid comhartha ERC-20 chuig an gconradh seo?

Má sheoltar comhartha ERC-20 chuig an RecipientContract, aistreofar na comharthaí, ach ní aithneofar an t-aistriú (ní dhéanfar aon imeacht Taiscigh() a bhácáil, agus ní athrófar luach na taiscí). Ní féidir taiscí ERC-20 nach dteastaíonn a scagadh ná a chosc.

Cad a tharlaíonn má theastaíonn uainn feidhm éigin a rith tar éis don taisce chomhartha a bheith críochnaithe?

Tá bealaí iomadúla ann chun é sin a dhéanamh. Sa sampla seo leanfaimid an modh a fhágann gurb ionann aistrithe ERC-223 agus aistrithe éitir:

1contract RecipientContract is IERC223Recipient {
2 event Foo();
3 event Bar(uint256 someNumber);
4 address tokenA; // The only token that we want to accept.
5 function tokenReceived(address _from, uint _value, bytes memory _data) public override
6 {
7 require(msg.sender == tokenA);
8 address(this).call(_data); // Handle incoming transaction and perform a subsequent function call.
9 }
10 function foo() public
11 {
12 emit Foo();
13 }
14 function bar(uint256 _someNumber) public
15 {
16 emit Bar(_someNumber);
17 }
18}
Taispeáin gach rud
Cóip

Nuair a gheobhaidh an RecipientContract chomhartha ERC-223 déanfaidh an conradh feidhm atá ionchódaithe mar pharaiméadar _data an idirbhirt chomharthaí, comhionann leis an gcaoi a n-ionchódaíonn idirbhearta éitear glaonna mar data idirbhirt. Léigh [an réimse sonraí] (https://ethereum.org/en/developers/docs/transactions/#the-data-field(opens in a new tab)) le haghaidh tuilleadh faisnéise.

Sa sampla thuas ní mór comhartha ERC-223 a aistriú chuig seoladh an RecipientContract leis an bhfeidhm transfer(address,uin256,bytes calldata _data). Más é 0xc2985578 (síniú feidhm foo()) an paraiméadar sonraí, déanfar an foo feidhme () a agairt tar éis an taisce chomhartha a fháil agus déanfar an t-imeacht Foo() a bhácáil.

Is féidir paraiméadair a ionchódú i sonraí an aistrithe chomharthaí freisin, mar shampla is féidir linn an fheidhm barra() a ghlaoch le luach 12345 le haghaidh _someNumber. Sa chás seo, caithfidh an data a bheith 0x0423a13200000000000000000000000000000000000000000000000000000000000004d2, áit a bhfuil 0x0423a132 ina shíniú ar an bhfeidhm bar(uint256) agus 00000000000000000000000000000000000000000000000000000000000004d2 ina 12345 mar uint256.

Teorainneacha

Cé go dtugann ERC-223 aghaidh ar roinnt saincheisteanna a aimsítear i gcaighdeán ERC-20, níl a theorainneacha féin ag baint leis:

  • Glacadh agus Comhoiriúnacht: Níl ERC-223 glactha go forleathan fós, rud a d’fhéadfadh teorainn a chur lena chomhoiriúnacht le huirlisí agus le hardáin atá ann cheana.
  • Comhoiriúnacht Siar: Níl ERC-223 comhoiriúnach siar le ERC-20, rud a chiallaíonn nach n-oibreoidh conarthaí agus uirlisí ERC-20 atá ann cheana le comharthaí ERC-223 gan modhnuithe.
  • Costais Gháis: D’fhéadfadh costais gháis níos airde a bheith mar thoradh ar sheiceálacha agus feidhmiúlachtaí breise in aistrithe ERC-223 i gcomparáid le hidirbhearta ERC-20.

Tuilleadh léitheoireachta

An raibh an t-alt seo cabhrach?