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:
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 rudCó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 override6 {7 // Tá sé tábhachtach é sin a thuiscint laistigh den fheidhm seo8 // 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 rudCó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)
nó 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 override6 {7 require(msg.sender == tokenA);8 address(this).call(_data); // Handle incoming transaction and perform a subsequent function call.9 }10 function foo() public11 {12 emit Foo();13 }14 function bar(uint256 _someNumber) public15 {16 emit Bar(_someNumber);17 }18}Taispeáin gach rudCó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) 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.