আমি সম্প্রতি কারমা মানি সম্পর্কে একটি নিবন্ধ লিখেছি, একটি অনন্য ERC-20 টোকেনের উপর ভিত্তি করে একটি বিকল্প মুদ্রা ব্যবস্থা। আমি কর্ম অর্থকে একটি বন্ধ সিস্টেম হিসাবে কল্পনা করেছি, যেখানে ব্যবহারকারীরা কর্মের সাথে লেনদেনের ফিও দিতে পারে। আমাদের নিজস্ব ব্লকচেইন তৈরি করা এটিকে বাস্তবে পরিণত করার একটি উপায় হবে, কিন্তু এটি একটি চ্যালেঞ্জিং কাজ। ব্লকচেইনের নিরাপত্তা এবং বিশ্বাসযোগ্যতা নিশ্চিত করার জন্য, আমাদের প্রয়োজনীয় অবকাঠামো এবং একটি পর্যাপ্ত বৃহৎ সম্প্রদায় প্রতিষ্ঠা করতে হবে। বিদ্যমান ব্লকচেইন ব্যবহার করা অনেক সহজ হবে। Gnosis বা Polygon এর মতো চেইন আছে, যেগুলো Ethereum-এর সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ এবং খুব কম লেনদেন ফি আছে। এই চেইনগুলিতে একটি ERC20 লেনদেনের জন্য ফি সাধারণত 1 সেন্টের কম। সমস্যা হল এই ফি অবশ্যই চেইনের নিজস্ব ক্রিপ্টোকারেন্সিতে দিতে হবে, যা ব্যবহারকারীদের জন্য চেইন ব্যবহারকে জটিল করে তুলতে পারে। সৌভাগ্যবশত, একটি ব্রিজিং সমাধান আছে, EIP-712 ধাতু লেনদেন।
একটি মেটা ট্রানজ্যাকশনের ক্ষেত্রে, ব্যবহারকারী একটি লেনদেন বর্ণনা করে একটি কাঠামো তৈরি করে এবং তারপরে তাদের ব্যক্তিগত কী দিয়ে ডিজিটালি স্বাক্ষর করে। এটি কারও জন্য চেক লেখার মতো। ডিজিটালি স্বাক্ষরিত লেনদেনটি একটি রিলে নোডে পাঠানো হয়, যা এটি একটি স্মার্ট চুক্তিতে জমা দেয়। চুক্তি স্বাক্ষর যাচাই করে, এবং যদি এটি বৈধ হয়, লেনদেন সম্পাদন করে। রিলে নোড চুক্তি সম্পাদনের জন্য অর্থ প্রদান করে।
একটি কর্ম লেনদেনে, উদাহরণস্বরূপ, ব্যবহারকারী লেনদেনের পরিমাণ (যেমন, 10 কর্ম ডলার), ইথেরিয়াম ঠিকানা যেখানে তারা পরিমাণ পাঠাতে চান এবং একটি লেনদেনের ফি (কর্ম ডলারে) প্রদান করে যা তারা দিতে ইচ্ছুক। লেনদেনের জন্য। এই কাঠামোটি ডিজিটালি স্বাক্ষরিত এবং একটি রিলে নোডে পাঠানো হয়। যদি নোডটি লেনদেন ফি গ্রহণযোগ্য বলে মনে করে, তবে এটি ডিজিটালভাবে স্বাক্ষরিত কাঠামোটি কর্ম চুক্তিতে জমা দেয়, যা স্বাক্ষর যাচাই করে এবং লেনদেন সম্পাদন করে। যেহেতু লেনদেন ফি রিলে নোড দ্বারা ব্লকচেইনের স্থানীয় মুদ্রায় প্রদান করা হয়, ব্যবহারকারীর কাছে মনে হয় যেন তারা তাদের নিজস্ব ব্লকচেইনের প্রয়োজন ছাড়াই লেনদেনের জন্য কর্ম ডলার দিয়ে অর্থ প্রদান করছে।
তত্ত্বের পরে, চলুন অনুশীলনটি দেখে নেওয়া যাক।
EIP-712 স্ট্যান্ডার্ড সংজ্ঞায়িত করে যে কীভাবে স্ট্রাকচার্ড ডেটা প্যাকেজগুলিকে প্রমিত পদ্ধতিতে স্বাক্ষর করতে হয়। মেটামাস্ক ব্যবহারকারীর জন্য একটি পাঠযোগ্য বিন্যাসে এই কাঠামোগত ডেটা প্রদর্শন করে। মেটামাস্কে দেখানো একটি EIP-712 অনুগত কাঠামো ( এই URL এ পরীক্ষা করা যেতে পারে ) দেখতে এইরকম:
উপরের লেনদেনটি নিম্নলিখিত সহজ কোড ব্যবহার করে তৈরি করা হয়েছিল:
async function main() { if (!window.ethereum || !window.ethereum.isMetaMask) { console.log("Please install MetaMask") return } const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); const chainId = await window.ethereum.request({ method: 'eth_chainId' }); const eip712domain_type_definition = { "EIP712Domain": [ { "name": "name", "type": "string" }, { "name": "version", "type": "string" }, { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ] } const karma_request_domain = { "name": "Karma Request", "version": "1", "chainId": chainId, "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" } document.getElementById('transfer_request')?.addEventListener("click", async function () { const transfer_request = { "types": { ...eip712domain_type_definition, "TransferRequest": [ { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" } ] }, "primaryType": "TransferRequest", "domain": karma_request_domain, "message": { "to": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", "amount": 1234 } } let signature = await window.ethereum.request({ "method": "eth_signTypedData_v4", "params": [ accounts[0], transfer_request ] }) alert("Signature: " + signature) }) } main()
eip712domain_type_definition হল একটি সাধারণ কাঠামোর বর্ণনা, যাতে মেটাডেটা থাকে। নামের ক্ষেত্রটি কাঠামোর নাম, সংস্করণ ক্ষেত্রটি কাঠামোর সংজ্ঞা সংস্করণ এবং চেইনআইডি এবং যাচাইকরণ চুক্তি ক্ষেত্রগুলি নির্ধারণ করে যে বার্তাটি কোন চুক্তির উদ্দেশ্যে করা হয়েছে৷ স্বাক্ষরিত লেনদেন শুধুমাত্র লক্ষ্য চুক্তিতে সম্পাদিত হয়েছে তা নিশ্চিত করার জন্য কার্যকরী চুক্তি এই মেটাডেটা যাচাই করে।
karma_request_domain- এ EIP712Domain গঠন দ্বারা সংজ্ঞায়িত মেটাডেটার নির্দিষ্ট মান রয়েছে।
আমরা স্বাক্ষরের জন্য মেটামাস্কে যে প্রকৃত কাঠামো পাঠাই তা স্থানান্তর_অনুরোধ ভেরিয়েবলের মধ্যে রয়েছে। টাইপ ব্লকে টাইপ সংজ্ঞা রয়েছে। এখানে, প্রথম উপাদানটি বাধ্যতামূলক EIP712Domain সংজ্ঞা, যা মেটাডেটা বর্ণনা করে। এটি প্রকৃত গঠন সংজ্ঞা দ্বারা অনুসরণ করা হয়, যা এই ক্ষেত্রে TransferRequest হয়। এটি সেই কাঠামো যা ব্যবহারকারীর জন্য মেটামাস্কে প্রদর্শিত হবে। ডোমেন ব্লকে মেটাডেটার নির্দিষ্ট মান থাকে, যখন বার্তাটিতে নির্দিষ্ট কাঠামো থাকে যা আমরা ব্যবহারকারীর সাথে স্বাক্ষর করতে চাই।
যখন কর্মের অর্থের কথা আসে, কীভাবে একটি মেটা ট্রানজ্যাকশন একত্রিত করা হয় এবং স্মার্ট চুক্তিতে পাঠানো হয় তার একটি উদাহরণ এইরকম দেখায়:
const types = { "TransferRequest": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "fee", "type": "uint256" }, { "name": "nonce", "type": "uint256" } ] } let nonce = await contract.connect(MINER).getNonce(ALICE.address) const message = { "from": ALICE.address, "to": JOHN.address, "amount": 10, "fee": 1, "nonce": nonce } const signature = await ALICE.signTypedData(karma_request_domain, types, message) await contract.connect(MINER).metaTransfer(ALICE.address, JOHN.address, 10, 1, nonce, signature) assert.equal(await contract.balanceOf(ALICE.address), ethers.toBigInt(11))
প্রকার পরিবর্তনশীল লেনদেনের গঠন সংজ্ঞায়িত করে। "থেকে" হল প্রেরকের ঠিকানা, যখন "থেকে" হল প্রাপকের ঠিকানা। পরিমাণ টোকেন স্থানান্তর করার পরিমাণ প্রতিনিধিত্ব করে। ফি হল টোকেনগুলির "পরিমাণ" যা আমরা আমাদের লেনদেন সম্পাদন করার বিনিময়ে এবং চেইনের স্থানীয় মুদ্রায় খরচ কভার করার বিনিময়ে রিলে নোডকে অফার করি। লেনদেনের স্বতন্ত্রতা নিশ্চিত করার জন্য "নোন্স" একটি কাউন্টার হিসাবে কাজ করে। এই ক্ষেত্রটি ছাড়া, একটি লেনদেন একাধিকবার সম্পাদিত হতে পারে। যাইহোক, ননসের জন্য ধন্যবাদ, একটি স্বাক্ষরিত লেনদেন শুধুমাত্র একবারই সম্পাদিত হতে পারে।
ethers.js দ্বারা প্রদত্ত signTypedData ফাংশন EIP-712 কাঠামোতে স্বাক্ষর করা সহজ করে তোলে। এটি পূর্বে উপস্থাপিত কোডের মতো একই কাজ করে কিন্তু একটি সহজ ব্যবহারের সাথে।
মেটা ট্রান্সফার হল মেটা-লেনদেন সম্পাদনের জন্য কর্ম চুক্তির পদ্ধতি। আসুন দেখি কিভাবে এটি কাজ করে:
function metaTransfer( address from, address to, uint256 amount, uint256 fee, uint256 nonce, bytes calldata signature ) public virtual returns (bool) { uint256 currentNonce = _useNonce(from, nonce); (address recoveredAddress, ECDSA.RecoverError err) = ECDSA.tryRecover( _hashTypedDataV4( keccak256( abi.encode( TRANSFER_REQUEST_TYPEHASH, from, to, amount, fee, currentNonce ) ) ), signature ); require( err == ECDSA.RecoverError.NoError && recoveredAddress == from, "Signature error" ); _transfer(recoveredAddress, to, amount); _transfer(recoveredAddress, msg.sender, fee); return true; }
স্বাক্ষর যাচাই করার জন্য, আমাদের প্রথমে কাঠামোর হ্যাশ তৈরি করতে হবে। এটি করার জন্য সঠিক পদক্ষেপগুলি EIP-712 স্ট্যান্ডার্ডে বিশদভাবে বর্ণনা করা হয়েছে, যার মধ্যে একটি নমুনা স্মার্ট চুক্তি এবং একটি নমুনা জাভাস্ক্রিপ্ট কোড রয়েছে।
সংক্ষেপে, সারমর্ম হল যে আমরা abi.encode ব্যবহার করে কাঠামোর ক্ষেত্রগুলির সাথে TYPEHASH (যা গঠন বিবরণের হ্যাশ) একত্রিত করি। তারপর একটি keccak256 হ্যাশ তৈরি করে। হ্যাশটি _hashTypedDataV4 পদ্ধতিতে প্রেরণ করা হয়েছে, কর্ম চুক্তিতে EIP712 OpenZeppelin চুক্তি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত। এই ফাংশনটি আমাদের কাঠামোতে মেটাডেটা যোগ করে এবং চূড়ান্ত হ্যাশ তৈরি করে, যার ফলে কাঠামোর বৈধতা খুব সহজ এবং স্বচ্ছ হয়। সবচেয়ে বাইরের ফাংশনটি হল ECDSA.tryRecover, যা হ্যাশ এবং স্বাক্ষর থেকে স্বাক্ষরকারীর ঠিকানা পুনরুদ্ধার করার চেষ্টা করে। যদি এটি "থেকে" প্যারামিটারের ঠিকানার সাথে মেলে তবে স্বাক্ষরটি বৈধ। কোডের শেষে, প্রকৃত লেনদেন সম্পাদিত হয় এবং লেনদেন সম্পাদনকারী রিলে নোড ফি গ্রহণ করে।
EIP-712 হল সাইনিং স্ট্রাকচারের জন্য একটি সাধারণ স্ট্যান্ডার্ড, এটি মেটা-লেনদেন বাস্তবায়নের জন্য অনেকগুলি ব্যবহারের মধ্যে একটি মাত্র। যেহেতু স্বাক্ষরটি শুধুমাত্র স্মার্ট চুক্তির মাধ্যমেই যাচাই করা যায় না, এটি ব্লকচেইন নয় এমন অ্যাপ্লিকেশনগুলিতেও খুব কার্যকর হতে পারে। উদাহরণস্বরূপ, এটি সার্ভার-সাইড প্রমাণীকরণের জন্য ব্যবহার করা যেতে পারে, যেখানে ব্যবহারকারী তাদের ব্যক্তিগত কী দিয়ে নিজেদের সনাক্ত করে। এই ধরনের সিস্টেম সাধারণত ক্রিপ্টোকারেন্সির সাথে যুক্ত উচ্চ স্তরের নিরাপত্তা প্রদান করতে পারে, যা শুধুমাত্র একটি হার্ডওয়্যার কী দিয়ে একটি ওয়েব অ্যাপ্লিকেশন ব্যবহার করার সম্ভাবনার জন্য অনুমতি দেয়। এছাড়াও, পৃথক API কলগুলিও মেটামাস্কের সাহায্যে স্বাক্ষর করা যেতে পারে।
আমি আশা করি যে EIP-712 স্ট্যান্ডার্ডের এই সংক্ষিপ্ত ওভারভিউ অনেকের জন্য অনুপ্রেরণাদায়ক হয়েছে এবং আপনি ব্লকচেইন-ভিত্তিক এবং নন-ব্লকচেন প্রকল্প উভয় ক্ষেত্রেই এটি ব্যবহার করতে সক্ষম হবেন।
প্রতিটি কোড কর্ম অর্থের গিটহাব রেপোতে উপলব্ধ।