பிரதான உள்ளடக்கத்திற்குச் செல்
Change page

ஸ்மார்ட் ஒப்பந்தங்களின் உடற்கூறியல்

பக்கத்தின் கடைசி புதுப்பிப்பு: 23 பிப்ரவரி, 2026

ஸ்மார்ட் ஒப்பந்தம் என்பது எத்தேரியத்தில் ஒரு முகவரியில் இயங்கும் ஒரு நிரலாகும். அவை ஒரு பரிவர்த்தனையைப் பெற்றவுடன் செயல்படுத்தக்கூடிய தரவு மற்றும் செயல்பாடுகளால் ஆனவை. ஒரு ஸ்மார்ட் ஒப்பந்தத்தை உருவாக்குவது என்ன என்பது பற்றிய மேலோட்டம் இங்கே உள்ளது.

முன்னேற்றக் கட்டுரை

முதலில் ஸ்மார்ட் ஒப்பந்தங்கள் பற்றி நீங்கள் படித்திருப்பதை உறுதிப்படுத்திக் கொள்ளுங்கள். ஜாவாஸ்கிரிப்ட் அல்லது பைத்தான் போன்ற நிரலாக்க மொழிகளுடன் நீங்கள் ஏற்கனவே பரிச்சயமானவர் என்று இந்த ஆவணம் கருதுகிறது.

தரவு

எந்தவொரு ஒப்பந்தத் தரவும் ஒரு இருப்பிடத்திற்கு ஒதுக்கப்பட வேண்டும்: ஒன்று storage அல்லது memory. ஒரு ஸ்மார்ட் ஒப்பந்தத்தில் சேமிப்பகத்தை மாற்றுவது செலவு மிக்கது, எனவே உங்கள் தரவு எங்கே இருக்க வேண்டும் என்பதை நீங்கள் கருத்தில் கொள்ள வேண்டும்.

சேமிப்பகம்

தொடர்ச்சியான தரவு சேமிப்பகம் என குறிப்பிடப்படுகிறது மற்றும் நிலை மாறிகளால் குறிப்பிடப்படுகிறது. இந்த மதிப்புகள் பிளாக்செயினில் நிரந்தரமாக சேமிக்கப்படுகின்றன. நீங்கள் வகையை அறிவிக்க வேண்டும், இதனால் ஒப்பந்தம் தொகுக்கப்படும்போது பிளாக்செயினில் எவ்வளவு சேமிப்பிடம் தேவைப்படுகிறது என்பதை கண்காணிக்க முடியும்.

1// சொலிடிட்டி எடுத்துக்காட்டு
2contract SimpleStorage {
3 uint storedData; // நிலை மாறி
4 // ...
5}
1# வைப்பர் எடுத்துக்காட்டு
2storedData: int128

நீங்கள் ஏற்கனவே பொருள் சார்ந்த நிரலாக்க மொழிகளை நிரலாக்கம் செய்திருந்தால், பெரும்பாலான வகைகளை நீங்கள் அறிந்திருக்க வாய்ப்புள்ளது. இருப்பினும், நீங்கள் எத்தேரியம் உருவாக்கத்திற்குப் புதியவராக இருந்தால், address உங்களுக்குப் புதிதாக இருக்க வேண்டும்.

ஒரு address வகை ஒரு எத்தேரியம் முகவரியை வைத்திருக்க முடியும், இது 20 பைட்டுகள் அல்லது 160 பிட்டுகளுக்குச் சமம். இது முன்னணி 0x உடன் ஹெக்ஸாடெசிமல் குறியீட்டில் திரும்புகிறது.

பிற வகைகள்:

  • பூலியன்
  • முழு எண்
  • நிலையான புள்ளி எண்கள்
  • நிலையான அளவு பைட் வரிசைகள்
  • மாறும் அளவிலான பைட் வரிசைகள்
  • விகிதமுறு மற்றும் முழு எண் எழுத்துருக்கள்
  • சரம் எழுத்துருக்கள்
  • ஹெக்ஸாடெசிமல் எழுத்துருக்கள்
  • எண்கள்

மேலும் விளக்கத்திற்கு, இந்த ஆவணங்களைப் பாருங்கள்:

நினைவகம்

ஒரு ஒப்பந்த செயல்பாட்டின் செயலாக்கத்தின் வாழ்நாளில் மட்டுமே சேமிக்கப்படும் மதிப்புகள் நினைவக மாறிகள் என்று அழைக்கப்படுகின்றன. இவை பிளாக்செயினில் நிரந்தரமாக சேமிக்கப்படாததால், அவற்றைப் பயன்படுத்துவது மிகவும் மலிவானது.

EVM தரவை (சேமிப்பகம், நினைவகம் மற்றும் அடுக்கு) எவ்வாறு சேமிக்கிறது என்பதைப் பற்றி சொலிடிட்டி ஆவணங்களில்opens in a new tab மேலும் அறியவும்.

சூழல் மாறிகள்

உங்கள் ஒப்பந்தத்தில் நீங்கள் வரையறுக்கும் மாறிகளுக்கு கூடுதலாக, சில சிறப்பு உலகளாவிய மாறிகள் உள்ளன. அவை முதன்மையாக பிளாக்செயின் அல்லது தற்போதைய பரிவர்த்தனை பற்றிய தகவல்களை வழங்க பயன்படுத்தப்படுகின்றன.

எடுத்துக்காட்டுகள்:

பண்புநிலை மாறிவிளக்கம்
block.timestampuint256தற்போதைய பிளாக் யுக நேரமுத்திரை
msg.senderமிகவும் பொதுவாக, இது வெளிப்புறமாக சொந்தமான கணக்கு (EOA) அல்லது ஒப்பந்தத்தை குறிக்கிறது (இது இலக்கு முகவரி) பெறலாம் அல்லது பிளாக்செயினில் பரிமாற்றங்களை அனுப்பலாம் (மூல முகவரி). மேலும் குறிப்பாக, இது ஒரு ஈ. சி. டி. எஸ். ஏ பொது விசையின் கெக்காக் ஹாஷின் சரியான 160 பிட்கள் ஆகும்செய்தியை அனுப்புபவர் (தற்போதைய அழைப்பு)

செயல்பாடுகள்

மிகவும் எளிமையான சொற்களில், உள்வரும் பரிவர்த்தனைகளுக்கு பதிலளிக்கும் விதமாக செயல்பாடுகள் தகவல்களைப் பெறலாம் அல்லது அமைக்கலாம்.

செயல்பாட்டு அழைப்புகளில் இரண்டு வகைகள் உள்ளன:

  • internal – இவை ஒரு EVM அழைப்பை உருவாக்காது
    • உள்ளக செயல்பாடுகள் மற்றும் நிலை மாறிகளை உள்வழியாக மட்டுமே அணுக முடியும் (அதாவது, தற்போதைய ஒப்பந்தத்திற்குள் அல்லது அதிலிருந்து பெறப்பட்ட ஒப்பந்தங்களிலிருந்து)
  • external – இவை ஒரு EVM அழைப்பை உருவாக்குகின்றன
    • வெளிப்புற செயல்பாடுகள் ஒப்பந்த இடைமுகத்தின் ஒரு பகுதியாகும், அதாவது அவற்றை மற்ற ஒப்பந்தங்களிலிருந்தும் பரிவர்த்தனைகள் வழியாகவும் அழைக்கலாம். ஒரு வெளிப்புற செயல்பாடு f ஐ உள்வழியாக அழைக்க முடியாது (அதாவது, f() வேலை செய்யாது, ஆனால் this.f() வேலை செய்யும்).

அவை public அல்லது private ஆகவும் இருக்கலாம்

  • public செயல்பாடுகளை ஒப்பந்தத்திற்குள் இருந்தே உள்வழியாகவோ அல்லது செய்திகள் மூலம் வெளிப்புறமாகவோ அழைக்கப்படலாம்
  • private செயல்பாடுகள் அவை வரையறுக்கப்பட்ட ஒப்பந்தத்திற்கு மட்டுமே தெரியும் மற்றும் பெறப்பட்ட ஒப்பந்தங்களில் தெரியாது

செயல்பாடுகள் மற்றும் நிலை மாறிகள் இரண்டையும் பொது அல்லது தனியாராக ஆக்கலாம்

ஒரு ஒப்பந்தத்தில் ஒரு நிலை மாறியைப் புதுப்பிப்பதற்கான ஒரு செயல்பாடு இங்கே உள்ளது:

1// சொலிடிட்டி எடுத்துக்காட்டு
2function update_name(string value) public {
3 dapp_name = value;
4}
  • string வகையின் value என்ற அளவுரு update_name என்ற செயல்பாட்டிற்கு அனுப்பப்படுகிறது
  • இது public என அறிவிக்கப்பட்டுள்ளது, அதாவது யார் வேண்டுமானாலும் அதை அணுகலாம்
  • இது view என அறிவிக்கப்படவில்லை, எனவே இது ஒப்பந்த நிலையை மாற்றியமைக்க முடியும்

காட்சி செயல்பாடுகள்

இந்த செயல்பாடுகள் ஒப்பந்தத்தின் தரவு நிலையை மாற்றியமைக்காது என்று உறுதியளிக்கின்றன. பொதுவான எடுத்துக்காட்டுகள் "getter" செயல்பாடுகள் ஆகும் – எடுத்துக்காட்டாக, ஒரு பயனரின் இருப்பைப் பெற இதைப் பயன்படுத்தலாம்.

1// சொலிடிட்டி எடுத்துக்காட்டு
2function balanceOf(address _owner) public view returns (uint256 _balance) {
3 return ownerPizzaCount[_owner];
4}
1dappName: public(string)
2
3@view
4@public
5def readName() -> string:
6 return dappName

நிலையை மாற்றுவதாகக் கருதப்படுபவை:

  1. நிலை மாறிகளில் எழுதுதல்.
  2. நிகழ்வுகளை வெளியிடுதல்opens in a new tab.
  3. பிற ஒப்பந்தங்களை உருவாக்குதல்opens in a new tab.
  4. selfdestruct-ஐப் பயன்படுத்துதல்.
  5. அழைப்புகள் மூலம் ஈதரை அனுப்புதல்.
  6. view அல்லது pure எனக் குறிக்கப்படாத எந்தச் செயல்பாட்டையும் அழைத்தல்.
  7. தாழ்-நிலை அழைப்புகளைப் பயன்படுத்துதல்.
  8. குறிப்பிட்ட ஆப்கோடுகளைக் கொண்டிருக்கும் இன்லைன் அசெம்பிளியைப் பயன்படுத்துதல்.

உருவாக்கிச் செயல்பாடுகள்

constructor செயல்பாடுகள் ஒப்பந்தம் முதலில் வரிசைப்படுத்தப்படும்போது ஒருமுறை மட்டுமே செயல்படுத்தப்படுகின்றன. பல வகுப்பு-அடிப்படையிலான நிரலாக்க மொழிகளில் உள்ள constructor போலவே, இந்தச் செயல்பாடுகள் பெரும்பாலும் நிலை மாறிகளை அவற்றின் குறிப்பிட்ட மதிப்புகளுக்கு துவக்குகின்றன.

1// சொலிடிட்டி எடுத்துக்காட்டு
2// ஒப்பந்தத்தின் தரவைத் துவக்கி, `owner`-ஐ அமைக்கிறது
3// ஒப்பந்தத்தை உருவாக்கியவரின் முகவரிக்கு.
4constructor() public {
5 // அனைத்து ஸ்மார்ட் ஒப்பந்தங்களும் அவற்றின் செயல்பாடுகளைத் தூண்டுவதற்கு வெளிப்புற பரிவர்த்தனைகளைச் சார்ந்துள்ளன.
6 // `msg` என்பது கொடுக்கப்பட்ட பரிவர்த்தனையில் தொடர்புடைய தரவை உள்ளடக்கிய ஒரு உலகளாவிய மாறி,
7 // அனுப்புநரின் முகவரி மற்றும் பரிவர்த்தனையில் சேர்க்கப்பட்டுள்ள ETH மதிப்பு போன்றவை.
8 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties
9 owner = msg.sender;
10}
அனைத்தையும் காட்டு
1# வைப்பர் எடுத்துக்காட்டு
2
3@external
4def __init__(_beneficiary: address, _bidding_time: uint256):
5 self.beneficiary = _beneficiary
6 self.auctionStart = block.timestamp
7 self.auctionEnd = self.auctionStart + _bidding_time

உள்ளமைக்கப்பட்ட செயல்பாடுகள்

உங்கள் ஒப்பந்தத்தில் நீங்கள் வரையறுக்கும் மாறிகள் மற்றும் செயல்பாடுகளுக்கு கூடுதலாக, சில சிறப்பு உள்ளமைக்கப்பட்ட செயல்பாடுகள் உள்ளன. மிகவும் தெளிவான உதாரணம்:

  • address.send() – சொலிடிட்டி
  • send(address) – வைப்பர்

இவை ஒப்பந்தங்கள் பிற கணக்குகளுக்கு ETH அனுப்ப அனுமதிக்கின்றன.

செயல்பாடுகளை எழுதுதல்

உங்கள் செயல்பாட்டிற்குத் தேவை:

  • அளவுரு மாறி மற்றும் வகை (அது அளவுருக்களை ஏற்றுக்கொண்டால்)
  • உள்ளக/வெளிப்புற அறிவிப்பு
  • pure/view/payable-இன் அறிவிப்பு
  • திரும்பும் வகை (அது ஒரு மதிப்பைத் திருப்பினால்)
1pragma solidity >=0.4.0 <=0.6.0;
2
3contract ExampleDapp {
4 string dapp_name; // நிலை மாறி
5
6 // ஒப்பந்தம் வரிசைப்படுத்தப்படும்போது அழைக்கப்பட்டு மதிப்பை துவக்குகிறது
7 constructor() public {
8 dapp_name = "My Example dapp";
9 }
10
11 // பெறுவதற்கான செயல்பாடு
12 function read_name() public view returns(string) {
13 return dapp_name;
14 }
15
16 // அமைப்பதற்கான செயல்பாடு
17 function update_name(string value) public {
18 dapp_name = value;
19 }
20}
அனைத்தையும் காட்டு

ஒரு முழுமையான ஒப்பந்தம் இதுபோல இருக்கலாம். இங்கே constructor செயல்பாடு dapp_name மாறிக்கு ஒரு ஆரம்ப மதிப்பை வழங்குகிறது.

நிகழ்வுகள் மற்றும் பதிவுகள்

நிகழ்வுகள் உங்கள் ஸ்மார்ட் ஒப்பந்தம் உங்கள் முன்பக்கம் அல்லது பிற சந்தா செலுத்தும் பயன்பாடுகளுடன் தொடர்பு கொள்ள உதவுகின்றன. ஒரு பரிவர்த்தனை சரிபார்க்கப்பட்டு ஒரு பிளாக்கில் சேர்க்கப்பட்டவுடன், ஸ்மார்ட் ஒப்பந்தங்கள் நிகழ்வுகளை வெளியிடலாம் மற்றும் தகவல்களைப் பதிவு செய்யலாம், அவற்றை முன்பக்கம் பின்னர் செயலாக்கிப் பயன்படுத்தலாம்.

குறிப்புரைக்கப்பட்ட எடுத்துக்காட்டுகள்

இவை சொலிடிட்டியில் எழுதப்பட்ட சில எடுத்துக்காட்டுகள். நீங்கள் குறியீட்டுடன் விளையாட விரும்பினால், Remixopens in a new tab-இல் அவற்றுடன் தொடர்பு கொள்ளலாம்.

ஹலோ வேர்ல்ட்

1// சொலிடிட்டியின் பதிப்பைக் குறிப்பிடுகிறது, சொற்பொருள் பதிப்பைப் பயன்படுத்துகிறது.
2// மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
3pragma solidity ^0.5.10;
4
5// `HelloWorld` என்ற பெயரில் ஒரு ஒப்பந்தத்தை வரையறுக்கிறது.
6// ஒரு ஒப்பந்தம் என்பது செயல்பாடுகள் மற்றும் தரவுகளின் (அதன் நிலை) தொகுப்பாகும்.
7// வரிசைப்படுத்தப்பட்டதும், ஒரு ஒப்பந்தம் எத்தேரியம் பிளாக்செயினில் ஒரு குறிப்பிட்ட முகவரியில் இருக்கும்.
8// மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
9contract HelloWorld {
10
11 // `string` வகையின் `message` என்ற நிலை மாறியை அறிவிக்கிறது.
12 // நிலை மாறிகள் என்பவை ஒப்பந்தச் சேமிப்பகத்தில் நிரந்தரமாக சேமிக்கப்படும் மதிப்புகளைக் கொண்ட மாறிகள்.
13 // `public` என்ற திறவுச்சொல் மாறிகளை ஒரு ஒப்பந்தத்திற்கு வெளியே இருந்து அணுகக்கூடியதாக ஆக்குகிறது
14 // மேலும் மதிப்பை அணுகுவதற்காக மற்ற ஒப்பந்தங்கள் அல்லது வாடிக்கையாளர்கள் அழைக்கக்கூடிய ஒரு செயல்பாட்டை உருவாக்குகிறது.
15 string public message;
16
17 // பல வகுப்பு அடிப்படையிலான பொருள் சார்ந்த மொழிகளைப் போலவே, ஒரு கன்ஸ்ட்ரக்டர் என்பது
18 // ஒப்பந்தம் உருவாக்கப்படும்போது மட்டுமே செயல்படுத்தப்படும் ஒரு சிறப்பு செயல்பாடு.
19 // ஒப்பந்தத்தின் தரவைத் துவக்க கன்ஸ்ட்ரக்டர்கள் பயன்படுத்தப்படுகின்றன.
20 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
21 constructor(string memory initMessage) public {
22 // `initMessage` என்ற ஒரு சர வாதத்தை ஏற்றுக்கொண்டு மதிப்பை அமைக்கிறது
23 // ஒப்பந்தத்தின் `message` சேமிப்பக மாறிக்குள்).
24 message = initMessage;
25 }
26
27 // ஒரு சர வாதத்தை ஏற்கும் ஒரு பொதுச் செயல்பாடு
28 // மற்றும் `message` சேமிப்பக மாறியைப் புதுப்பிக்கிறது.
29 function update(string memory newMessage) public {
30 message = newMessage;
31 }
32}
அனைத்தையும் காட்டு

டோக்கன்

1pragma solidity ^0.5.10;
2
3contract Token {
4 // ஒரு `address` என்பது மின்னஞ்சல் முகவரியுடன் ஒப்பிடத்தக்கது - இது எத்தேரியத்தில் ஒரு கணக்கை அடையாளம் காணப் பயன்படுகிறது.
5 // முகவரிகள் ஒரு ஸ்மார்ட் ஒப்பந்தம் அல்லது ஒரு வெளிப்புற (பயனர்) கணக்குகளைக் குறிக்கலாம்.
6 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/types.html#address
7 address public owner;
8
9 // ஒரு `mapping` என்பது அடிப்படையில் ஒரு ஹாஷ் அட்டவணை தரவுக் கட்டமைப்பாகும்.
10 // இந்த `mapping` ஒரு கையொப்பமிடப்படாத முழு எண்ணை (டோக்கன் இருப்பு) ஒரு முகவரிக்கு (டோக்கன் வைத்திருப்பவர்) ஒதுக்குகிறது.
11 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types
12 mapping (address => uint) public balances;
13
14 // நிகழ்வுகள் பிளாக்செயினில் செயல்பாட்டைப் பதிவு செய்ய அனுமதிக்கின்றன.
15 // எத்தேரியம் வாடிக்கையாளர்கள் ஒப்பந்த நிலை மாற்றங்களுக்கு வினைபுரிய நிகழ்வுகளைக் கேட்கலாம்.
16 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events
17 event Transfer(address from, address to, uint amount);
18
19 // ஒப்பந்தத்தின் தரவைத் துவக்கி, `owner`-ஐ அமைக்கிறது
20 // ஒப்பந்தத்தை உருவாக்கியவரின் முகவரிக்கு.
21 constructor() public {
22 // அனைத்து ஸ்மார்ட் ஒப்பந்தங்களும் அவற்றின் செயல்பாடுகளைத் தூண்டுவதற்கு வெளிப்புற பரிவர்த்தனைகளைச் சார்ந்துள்ளன.
23 // `msg` என்பது கொடுக்கப்பட்ட பரிவர்த்தனையில் தொடர்புடைய தரவை உள்ளடக்கிய ஒரு உலகளாவிய மாறி,
24 // அனுப்புநரின் முகவரி மற்றும் பரிவர்த்தனையில் சேர்க்கப்பட்டுள்ள ETH மதிப்பு போன்றவை.
25 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties
26 owner = msg.sender;
27 }
28
29 // புதிய டோக்கன்களின் ஒரு அளவை உருவாக்கி அவற்றை ஒரு முகவரிக்கு அனுப்புகிறது.
30 function mint(address receiver, uint amount) public {
31 // `require` என்பது சில நிபந்தனைகளைச் செயல்படுத்தப் பயன்படும் ஒரு கட்டுப்பாட்டுக் கட்டமைப்பாகும்.
32 // ஒரு `require` அறிக்கை `false` என மதிப்பிடப்பட்டால், ஒரு விதிவிலக்கு தூண்டப்படுகிறது,
33 // இது தற்போதைய அழைப்பின் போது நிலையில் செய்யப்பட்ட அனைத்து மாற்றங்களையும் மாற்றியமைக்கிறது.
34 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions
35
36 // ஒப்பந்த உரிமையாளர் மட்டுமே இந்தச் செயல்பாட்டை அழைக்க முடியும்
37 require(msg.sender == owner, "You are not the owner.");
38
39 // டோக்கன்களின் அதிகபட்ச அளவைச் செயல்படுத்துகிறது
40 require(amount < 1e60, "Maximum issuance exceeded");
41
42 // `receiver`-இன் இருப்பை `amount` ஆல் அதிகரிக்கிறது
43 balances[receiver] += amount;
44 }
45
46 // ஏற்கனவே உள்ள டோக்கன்களின் ஒரு அளவை எந்தவொரு அழைப்பாளரிடமிருந்தும் ஒரு முகவரிக்கு அனுப்புகிறது.
47 function transfer(address receiver, uint amount) public {
48 // அனுப்புநரிடம் அனுப்ப போதுமான டோக்கன்கள் இருக்க வேண்டும்
49 require(amount <= balances[msg.sender], "Insufficient balance.");
50
51 // இரண்டு முகவரிகளின் டோக்கன் இருப்புகளைச் சரிசெய்கிறது
52 balances[msg.sender] -= amount;
53 balances[receiver] += amount;
54
55 // முன்பு வரையறுக்கப்பட்ட நிகழ்வை வெளியிடுகிறது
56 emit Transfer(msg.sender, receiver, amount);
57 }
58}
அனைத்தையும் காட்டு

தனித்துவமான டிஜிட்டல் சொத்து

1pragma solidity ^0.5.10;
2
3// மற்ற கோப்புகளிலிருந்து சின்னங்களை தற்போதைய ஒப்பந்தத்திற்குள் இறக்குமதி செய்கிறது.
4// இந்த விஷயத்தில், OpenZeppelin-இல் இருந்து ஒரு தொடர் உதவி ஒப்பந்தங்கள்.
5// மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files
6
7import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol";
8import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
9import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol";
10import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol";
11
12// `is` என்ற திறவுச்சொல் வெளிப்புற ஒப்பந்தங்களிலிருந்து செயல்பாடுகள் மற்றும் திறவுச்சொற்களைப் பெறப் பயன்படுகிறது.
13// இந்த விஷயத்தில், `CryptoPizza` `IERC721` மற்றும் `ERC165` ஒப்பந்தங்களிலிருந்து பெறப்படுகிறது.
14// மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance
15contract CryptoPizza is IERC721, ERC165 {
16 // எண்கணித செயல்பாடுகளைப் பாதுகாப்பாகச் செய்ய OpenZeppelin-இன் SafeMath நூலகத்தைப் பயன்படுத்துகிறது.
17 // மேலும் அறிக: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath
18 using SafeMath for uint256;
19
20 // சொலிடிட்டியில் உள்ள நிலையான நிலை மாறிகள் மற்ற மொழிகளைப் போலவே இருக்கும்
21 // ஆனால் நீங்கள் தொகுக்கும் நேரத்தில் நிலையானதாக இருக்கும் ஒரு கோவையிலிருந்து ஒதுக்க வேண்டும்.
22 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables
23 uint256 constant dnaDigits = 10;
24 uint256 constant dnaModulus = 10 ** dnaDigits;
25 bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
26
27 // அமைப்பு வகைகள் உங்கள் சொந்த வகையை வரையறுக்க உங்களை அனுமதிக்கின்றன
28 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs
29 struct Pizza {
30 string name;
31 uint256 dna;
32 }
33
34 // பிஸ்ஸா அமைப்புகளின் வெற்று வரிசையை உருவாக்குகிறது
35 Pizza[] public pizzas;
36
37 // பிஸ்ஸா ஐடியிலிருந்து அதன் உரிமையாளரின் முகவரிக்கு மேப்பிங்
38 mapping(uint256 => address) public pizzaToOwner;
39
40 // உரிமையாளரின் முகவரியிலிருந்து சொந்தமான டோக்கன்களின் எண்ணிக்கைக்கு மேப்பிங்
41 mapping(address => uint256) public ownerPizzaCount;
42
43 // டோக்கன் ஐடியிலிருந்து அங்கீகரிக்கப்பட்ட முகவரிக்கு மேப்பிங்
44 mapping(uint256 => address) pizzaApprovals;
45
46 // நீங்கள் மேப்பிங்குகளை உள்ளடக்கலாம், இந்த எடுத்துக்காட்டு உரிமையாளரை ஆபரேட்டர் ஒப்புதல்களுக்கு மேப் செய்கிறது
47 mapping(address => mapping(address => bool)) private operatorApprovals;
48
49 // சரம் (பெயர்) மற்றும் டிஎன்ஏவிலிருந்து ஒரு சீரற்ற பிஸ்ஸாவை உருவாக்க உள்ளக செயல்பாடு
50 function _createPizza(string memory _name, uint256 _dna)
51 // `internal` என்ற திறவுச்சொல் இந்தச் செயல்பாடு மட்டுமே தெரியும் என்று பொருள்
52 // இந்த ஒப்பந்தம் மற்றும் இந்த ஒப்பந்தத்திலிருந்து பெறப்பட்ட ஒப்பந்தங்களுக்குள்
53 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters
54 internal
55 // `isUnique` என்பது பிஸ்ஸா ஏற்கனவே உள்ளதா என்று சரிபார்க்கும் ஒரு செயல்பாடு மாற்றியாகும்
56 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers
57 isUnique(_name, _dna)
58 {
59 // பிஸ்ஸா வரிசையில் பிஸ்ஸாவைச் சேர்த்து ஐடியைப் பெறுகிறது
60 uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1);
61
62 // பிஸ்ஸா உரிமையாளர் தற்போதைய பயனருடன் ஒரே மாதிரியாக இருக்கிறார் என்பதைச் சரிபார்க்கிறது
63 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions
64
65 // முகவரி(0) என்பது பூஜ்ஜிய முகவரி என்பதை நினைவில் கொள்க,
66 // இது pizza[id] இன்னும் ஒரு குறிப்பிட்ட பயனருக்கு ஒதுக்கப்படவில்லை என்பதைக் குறிக்கிறது.
67
68 assert(pizzaToOwner[id] == address(0));
69
70 // பிஸ்ஸாவை உரிமையாளருக்கு வரைபடமாக்குகிறது
71 pizzaToOwner[id] = msg.sender;
72 ownerPizzaCount[msg.sender] = SafeMath.add(
73 ownerPizzaCount[msg.sender],
74 1
75 );
76 }
77
78 // சரத்திலிருந்து (பெயர்) ஒரு சீரற்ற பிஸ்ஸாவை உருவாக்குகிறது
79 function createRandomPizza(string memory _name) public {
80 uint256 randDna = generateRandomDna(_name, msg.sender);
81 _createPizza(_name, randDna);
82 }
83
84 // சரம் (பெயர்) மற்றும் உரிமையாளரின் (உருவாக்குபவர்) முகவரியிலிருந்து சீரற்ற டிஎன்ஏவை உருவாக்குகிறது
85 function generateRandomDna(string memory _str, address _owner)
86 public
87 // `pure` எனக் குறிக்கப்பட்ட செயல்பாடுகள் நிலையிலிருந்து படிக்கவோ அல்லது மாற்றவோ மாட்டோம் என்று உறுதியளிக்கின்றன
88 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions
89 pure
90 returns (uint256)
91 {
92 // சரம் (பெயர்) + முகவரி (உரிமையாளர்) இலிருந்து சீரற்ற uint-ஐ உருவாக்குகிறது
93 uint256 rand = uint256(keccak256(abi.encodePacked(_str))) +
94 uint256(_owner);
95 rand = rand % dnaModulus;
96 return rand;
97 }
98
99 // உரிமையாளரால் கண்டறியப்பட்ட பிஸ்ஸாக்களின் வரிசையைத் திருப்புகிறது
100 function getPizzasByOwner(address _owner)
101 public
102 // `view` எனக் குறிக்கப்பட்ட செயல்பாடுகள் நிலையை மாற்றியமைக்காது என்று உறுதியளிக்கின்றன
103 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions
104 view
105 returns (uint256[] memory)
106 {
107 // மதிப்புகளைச் சேமிப்பதற்காக `memory` சேமிப்பக இருப்பிடத்தைப் பயன்படுத்துகிறது
108 // இந்தச் செயல்பாட்டு அழைப்பின் வாழ்நாள் சுழற்சி.
109 // மேலும் அறிக: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack
110 uint256[] memory result = new uint256[](ownerPizzaCount[_owner]);
111 uint256 counter = 0;
112 for (uint256 i = 0; i < pizzas.length; i++) {
113 if (pizzaToOwner[i] == _owner) {
114 result[counter] = i;
115 counter++;
116 }
117 }
118 return result;
119 }
120
121 // பிஸ்ஸா மற்றும் உரிமையை மற்றொரு முகவரிக்கு மாற்றுகிறது
122 function transferFrom(address _from, address _to, uint256 _pizzaId) public {
123 require(_from != address(0) && _to != address(0), "Invalid address.");
124 require(_exists(_pizzaId), "Pizza does not exist.");
125 require(_from != _to, "Cannot transfer to the same address.");
126 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");
127
128 ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1);
129 ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1);
130 pizzaToOwner[_pizzaId] = _to;
131
132 // இறக்குமதி செய்யப்பட்ட IERC721 ஒப்பந்தத்தில் வரையறுக்கப்பட்ட நிகழ்வை வெளியிடுகிறது
133 emit Transfer(_from, _to, _pizzaId);
134 _clearApproval(_to, _pizzaId);
135 }
136
137 /**
138 * கொடுக்கப்பட்ட டோக்கன் ஐடியின் உரிமையை மற்றொரு முகவரிக்கு பாதுகாப்பாக மாற்றுகிறது
139 * இலக்கு முகவரி ஒரு ஒப்பந்தமாக இருந்தால், அது `onERC721Received` என்பதை செயல்படுத்த வேண்டும்,
140 * இது பாதுகாப்பான பரிமாற்றத்தின் போது அழைக்கப்பட்டு, மாய மதிப்பைத் திருப்புகிறது
141 * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;
142 * இல்லையெனில், பரிமாற்றம் மாற்றியமைக்கப்படுகிறது.
143 */
144 function safeTransferFrom(address from, address to, uint256 pizzaId)
145 public
146 {
147 // solium-disable-next-line arg-overflow
148 this.safeTransferFrom(from, to, pizzaId, "");
149 }
150
151 /**
152 * கொடுக்கப்பட்ட டோக்கன் ஐடியின் உரிமையை மற்றொரு முகவரிக்கு பாதுகாப்பாக மாற்றுகிறது
153 * இலக்கு முகவரி ஒரு ஒப்பந்தமாக இருந்தால், அது `onERC721Received` என்பதை செயல்படுத்த வேண்டும்,
154 * இது பாதுகாப்பான பரிமாற்றத்தின் போது அழைக்கப்பட்டு, மாய மதிப்பைத் திருப்புகிறது
155 * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;
156 * இல்லையெனில், பரிமாற்றம் மாற்றியமைக்கப்படுகிறது.
157 */
158 function safeTransferFrom(
159 address from,
160 address to,
161 uint256 pizzaId,
162 bytes memory _data
163 ) public {
164 this.transferFrom(from, to, pizzaId);
165 require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received.");
166 }
167
168 /**
169 * இலக்கு முகவரியில் `onERC721Received` ஐ அழைக்க உள்ளக செயல்பாடு
170 * இலக்கு முகவரி ஒரு ஒப்பந்தம் இல்லையென்றால் அழைப்பு செயல்படுத்தப்படாது
171 */
172 function _checkOnERC721Received(
173 address from,
174 address to,
175 uint256 pizzaId,
176 bytes memory _data
177 ) internal returns (bool) {
178 if (!isContract(to)) {
179 return true;
180 }
181
182 bytes4 retval = IERC721Receiver(to).onERC721Received(
183 msg.sender,
184 from,
185 pizzaId,
186 _data
187 );
188 return (retval == _ERC721_RECEIVED);
189 }
190
191 // ஒரு பிஸ்ஸாவை எரிக்கிறது - டோக்கனை முழுமையாக அழிக்கிறது
192 // `external` செயல்பாடு மாற்றி என்பது இந்தச் செயல்பாடு
193 // ஒப்பந்த இடைமுகத்தின் ஒரு பகுதியாகும், மற்ற ஒப்பந்தங்கள் அதை அழைக்கலாம்
194 function burn(uint256 _pizzaId) external {
195 require(msg.sender != address(0), "Invalid address.");
196 require(_exists(_pizzaId), "Pizza does not exist.");
197 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");
198
199 ownerPizzaCount[msg.sender] = SafeMath.sub(
200 ownerPizzaCount[msg.sender],
201 1
202 );
203 pizzaToOwner[_pizzaId] = address(0);
204 }
205
206 // முகவரி மூலம் பிஸ்ஸாக்களின் எண்ணிக்கையைத் திருப்புகிறது
207 function balanceOf(address _owner) public view returns (uint256 _balance) {
208 return ownerPizzaCount[_owner];
209 }
210
211 // ஐடி மூலம் கண்டறியப்பட்ட பிஸ்ஸாவின் உரிமையாளரைத் திருப்புகிறது
212 function ownerOf(uint256 _pizzaId) public view returns (address _owner) {
213 address owner = pizzaToOwner[_pizzaId];
214 require(owner != address(0), "Invalid Pizza ID.");
215 return owner;
216 }
217
218 // பிஸ்ஸாவின் உரிமையை மாற்றுவதற்கு மற்றொரு முகவரியை அங்கீகரிக்கிறது
219 function approve(address _to, uint256 _pizzaId) public {
220 require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner.");
221 pizzaApprovals[_pizzaId] = _to;
222 emit Approval(msg.sender, _to, _pizzaId);
223 }
224
225 // குறிப்பிட்ட பிஸ்ஸாவிற்கு அங்கீகரிக்கப்பட்ட முகவரியைத் திருப்புகிறது
226 function getApproved(uint256 _pizzaId)
227 public
228 view
229 returns (address operator)
230 {
231 require(_exists(_pizzaId), "Pizza does not exist.");
232 return pizzaApprovals[_pizzaId];
233 }
234
235 /**
236 * கொடுக்கப்பட்ட டோக்கன் ஐடியின் தற்போதைய ஒப்புதலை அழிக்க தனிப்பட்ட செயல்பாடு
237 * கொடுக்கப்பட்ட முகவரி உண்மையில் டோக்கனின் உரிமையாளர் இல்லையென்றால் மாற்றியமைக்கிறது
238 */
239 function _clearApproval(address owner, uint256 _pizzaId) private {
240 require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner.");
241 require(_exists(_pizzaId), "Pizza does not exist.");
242 if (pizzaApprovals[_pizzaId] != address(0)) {
243 pizzaApprovals[_pizzaId] = address(0);
244 }
245 }
246
247 /*
248 * கொடுக்கப்பட்ட ஆபரேட்டரின் ஒப்புதலை அமைக்கிறது அல்லது நீக்குகிறது
249 * ஒரு ஆபரேட்டர் தங்கள் சார்பாக அனுப்புநரின் அனைத்து டோக்கன்களையும் மாற்ற அனுமதிக்கப்படுகிறார்
250 */
251 function setApprovalForAll(address to, bool approved) public {
252 require(to != msg.sender, "Cannot approve own address");
253 operatorApprovals[msg.sender][to] = approved;
254 emit ApprovalForAll(msg.sender, to, approved);
255 }
256
257 // கொடுக்கப்பட்ட உரிமையாளரால் ஒரு ஆபரேட்டர் அங்கீகரிக்கப்பட்டுள்ளாரா என்பதைக் கூறுகிறது
258 function isApprovedForAll(address owner, address operator)
259 public
260 view
261 returns (bool)
262 {
263 return operatorApprovals[owner][operator];
264 }
265
266 // பிஸ்ஸாவின் உரிமையை எடுக்கிறது - அங்கீகரிக்கப்பட்ட பயனர்களுக்கு மட்டுமே
267 function takeOwnership(uint256 _pizzaId) public {
268 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");
269 address owner = this.ownerOf(_pizzaId);
270 this.transferFrom(owner, msg.sender, _pizzaId);
271 }
272
273 // பிஸ்ஸா இருக்கிறதா என்று சரிபார்க்கிறது
274 function _exists(uint256 pizzaId) internal view returns (bool) {
275 address owner = pizzaToOwner[pizzaId];
276 return owner != address(0);
277 }
278
279 // முகவரி உரிமையாளரா அல்லது பிஸ்ஸாவை மாற்ற அங்கீகரிக்கப்பட்டுள்ளதா என்று சரிபார்க்கிறது
280 function _isApprovedOrOwner(address spender, uint256 pizzaId)
281 internal
282 view
283 returns (bool)
284 {
285 address owner = pizzaToOwner[pizzaId];
286 // Solium சரிபார்ப்பை முடக்கு, ஏனெனில்
287 // https://github.com/duaraghav8/Solium/issues/175
288 // solium-disable-next-line operator-whitespace
289 return (spender == owner ||
290 this.getApproved(pizzaId) == spender ||
291 this.isApprovedForAll(owner, spender));
292 }
293
294 // பிஸ்ஸா தனித்துவமானதா மற்றும் இன்னும் இல்லை என்பதைச் சரிபார்க்கவும்
295 modifier isUnique(string memory _name, uint256 _dna) {
296 bool result = true;
297 for (uint256 i = 0; i < pizzas.length; i++) {
298 if (
299 keccak256(abi.encodePacked(pizzas[i].name)) ==
300 keccak256(abi.encodePacked(_name)) &&
301 pizzas[i].dna == _dna
302 ) {
303 result = false;
304 }
305 }
306 require(result, "Pizza with such name already exists.");
307 _;
308 }
309
310 // இலக்கு முகவரி ஒரு ஒப்பந்தமா இல்லையா என்பதைத் திருப்புகிறது
311 function isContract(address account) internal view returns (bool) {
312 uint256 size;
313 // தற்போது ஒரு முகவரியில் ஒரு ஒப்பந்தம் உள்ளதா என்பதை சரிபார்க்க இதைவிட சிறந்த வழி இல்லை
314 // அந்த முகவரியில் உள்ள குறியீட்டின் அளவை சரிபார்ப்பதை விட.
315 // இது எப்படி வேலை செய்கிறது என்பது பற்றிய மேலும் விவரங்களுக்கு https://ethereum.stackexchange.com/a/14016/36603-ஐப் பார்க்கவும்.
316 // TODO செரினிட்டி வெளியீட்டிற்கு முன் இதை மீண்டும் சரிபார்க்கவும், ஏனெனில் அப்போது அனைத்து முகவரிகளும்
317 // ஒப்பந்தங்களாக இருக்கும்.
318 // solium-disable-next-line security/no-inline-assembly
319 assembly {
320 size := extcodesize(account)
321 }
322 return size > 0;
323 }
324}
அனைத்தையும் காட்டு

மேலும் வாசிக்க

ஸ்மார்ட் ஒப்பந்தங்கள் பற்றிய முழுமையான மேலோட்டத்திற்கு சொலிடிட்டி மற்றும் வைப்பரின் ஆவணங்களைப் பார்க்கவும்:

இந்தக் கட்டுரை உதவியாக இருந்ததா?