EIP-1271: স্মার্ট কন্ট্রাক্ট সিগনেচার সাইন এবং ভেরিফাই করা
EIP-1271 (opens in a new tab) স্ট্যান্ডার্ড স্মার্ট কন্ট্রাক্টগুলোকে সিগনেচার ভেরিফাই করার অনুমতি দেয়।
এই টিউটোরিয়ালে, আমরা ডিজিটাল সিগনেচার, EIP-1271 এর পটভূমি এবং Safe (opens in a new tab) (পূর্বে Gnosis Safe) দ্বারা ব্যবহৃত EIP-1271 এর নির্দিষ্ট ইমপ্লিমেন্টেশনের একটি ওভারভিউ দেব। সব মিলিয়ে, এটি আপনার নিজের কন্ট্রাক্টগুলোতে EIP-1271 ইমপ্লিমেন্ট করার জন্য একটি প্রারম্ভিক বিন্দু হিসেবে কাজ করতে পারে।
সিগনেচার কী?
এই প্রসঙ্গে, একটি সিগনেচার (আরও সঠিকভাবে, একটি "ডিজিটাল সিগনেচার") হলো একটি মেসেজ এবং সাথে এমন এক ধরণের প্রমাণ যা নিশ্চিত করে যে মেসেজটি একজন নির্দিষ্ট ব্যক্তি/প্রেরক/এডড্রেস থেকে এসেছে।
উদাহরণস্বরূপ, একটি ডিজিটাল সিগনেচার দেখতে এমন হতে পারে:
- মেসেজ: "আমি আমার ইথিরিয়াম ওয়ালেট দিয়ে এই ওয়েবসাইটে লগ ইন করতে চাই।"
- সাইনার: আমার এডড্রেস হলো
0x000… - প্রমাণ: এখানে কিছু প্রমাণ রয়েছে যে আমি,
0x000…, আসলে এই সম্পূর্ণ মেসেজটি তৈরি করেছি (এটি সাধারণত ক্রিপ্টোগ্রাফিক কিছু হয়ে থাকে)।
এটি মনে রাখা গুরুত্বপূর্ণ যে একটি ডিজিটাল সিগনেচারে "মেসেজ" এবং "সিগনেচার" উভয়ই অন্তর্ভুক্ত থাকে।
কেন? উদাহরণস্বরূপ, আপনি যদি আমাকে সাইন করার জন্য একটি কন্ট্রাক্ট দেন, এবং তারপর আমি সিগনেচারের পৃষ্ঠাটি কেটে ফেলি এবং কন্ট্রাক্টের বাকি অংশ ছাড়া শুধুমাত্র আমার সিগনেচারগুলো আপনাকে ফেরত দিই, তবে কন্ট্রাক্টটি বৈধ হবেবিধা না।
একইভাবে, একটি যুক্ত মেসেজ ছাড়া ডিজিটাল সিগনেচারের কোনো অর্থ নেই!
EIP-1271 কেন বিদ্যমান?
ইথিরিয়াম-ভিত্তিক ব্লকচেইনগুলোতে ব্যবহারের জন্য একটি ডিজিটাল সিগনেচার তৈরি করতে, আপনার সাধারণত একটি গোপন প্রাইভেট কি প্রয়োজন যা অন্য কেউ জানে না। এটিই আপনার সিগনেচারকে আপনার করে তোলে (গোপন কি-এর জ্ঞান ছাড়া অন্য কেউ একই সিগনেচার তৈরি করতে পারে না)।
আপনার ইথিরিয়াম একাউন্টের (অর্থাৎ, আপনার এক্সটার্নালি ওনড একাউন্ট/EOA) সাথে একটি প্রাইভেট কি যুক্ত থাকে, এবং এই প্রাইভেট কি-টি সাধারণত তখন ব্যবহৃত হয় যখন কোনো ওয়েবসাইট বা ডিএ্যাপ আপনার কাছে সিগনেচার চায় (যেমন, "Log in with Ethereum" এর জন্য)।
একটি অ্যাপ ethers.js এর মতো থার্ড-পার্টি লাইব্রেরি ব্যবহার করে আপনার তৈরি করা সিগনেচার ভেরিফাই করতে পারে (opens in a new tab) আপনার প্রাইভেট কি না জেনেই (opens in a new tab) এবং নিশ্চিত হতে পারে যে আপনিই সিগনেচারটি তৈরি করেছেন।
আসলে, যেহেতু EOA ডিজিটাল সিগনেচারগুলো পাবলিক-কি ক্রিপ্টোগ্রাফি ব্যবহার করে, তাই এগুলো অফচেইন তৈরি এবং ভেরিফাই করা যায়! এভাবেই গ্যাসহীন DAO ভোটিং কাজ করে — অনচেইন ভোট জমা দেওয়ার পরিবর্তে, ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে অফচেইন ডিজিটাল সিগনেচার তৈরি এবং ভেরিফাই করা যায়।
যদিও EOA একাউন্টগুলোর একটি প্রাইভেট কি থাকে, স্মার্ট কন্ট্রাক্ট একাউন্টগুলোর কোনো ধরণের প্রাইভেট বা গোপন কি থাকে না (তাই "Log in with Ethereum" ইত্যাদি স্মার্ট কন্ট্রাক্ট একাউন্টগুলোর সাথে নেটিভভাবে কাজ করতে পারে না)।
EIP-1271 যে সমস্যার সমাধান করতে চায়: আমরা কীভাবে বলতে পারি যে একটি স্মার্ট কন্ট্রাক্ট সিগনেচার বৈধ যদি স্মার্ট কন্ট্রাক্টের এমন কোনো "গোপন" কিছু না থাকে যা এটি সিগনেচারে অন্তর্ভুক্ত করতে পারে?
EIP-1271 কীভাবে কাজ করে?
স্মার্ট কন্ট্রাক্টগুলোর কোনো প্রাইভেট কি নেই যা মেসেজ সাইন করতে ব্যবহার করা যেতে পারে। তাহলে আমরা কীভাবে বুঝব যে একটি সিগনেচার আসল কিনা?
আচ্ছা, একটি উপায় হলো আমরা স্মার্ট কন্ট্রাক্টকে শুধু জিজ্ঞেস করতে পারি যে একটি সিগনেচার আসল কিনা!
EIP-1271 যা করে তা হলো এটি একটি স্মার্ট কন্ট্রাক্টকে প্রদত্ত সিগনেচার বৈধ কিনা তা "জিজ্ঞেস করার" এই ধারণাটিকে প্রমিত (standardize) করে।
যে কন্ট্রাক্ট EIP-1271 ইমপ্লিমেন্ট করে তার অবশ্যই isValidSignature নামের একটি ফাংশন থাকতে হবে যা একটি মেসেজ এবং একটি সিগনেচার গ্রহণ করে। এরপর কন্ট্রাক্টটি কিছু ভ্যালিডেশন লজিক চালাতে পারে (স্পেসিফিকেশন এখানে নির্দিষ্ট কিছু প্রয়োগ করতে বাধ্য করে না) এবং তারপর সিগনেচারটি বৈধ কিনা তা নির্দেশ করে একটি ভ্যালু রিটার্ন করতে পারে।
যদি isValidSignature একটি বৈধ ফলাফল রিটার্ন করে, তবে এর মানে হলো কন্ট্রাক্টটি বলছে "হ্যাঁ, আমি এই সিগনেচার + মেসেজ অনুমোদন করছি!"
ইন্টারফেস
এখানে EIP-1271 স্পেসিফিকেশনের সঠিক ইন্টারফেস দেওয়া হলো (আমরা নিচে _hash প্যারামিটার নিয়ে কথা বলব, তবে আপাতত এটিকে ভেরিফাই করা হচ্ছে এমন মেসেজ হিসেবে ধরে নিন):
1pragma solidity ^0.5.0;23contract ERC1271 {45 // bytes4(keccak256("isValidSignature(bytes32,bytes)")6 bytes4 constant internal MAGICVALUE = 0x1626ba7e;78 /* *9 * @dev প্রদানকৃত সিগনেচারটি প্রদানকৃত হ্যাস এর জন্য বৈধ কিনা তা রিটার্ন করতে হবে10 * @param _hash যে ডেটা সাইন করা হবে তার হ্যাস11 * @param _signature _hash এর সাথে যুক্ত সিগনেচার বাইট অ্যারে12 *13 * ফাংশনটি পাস হলে অবশ্যই bytes4 ম্যাজিক ভ্যালু 0x1626ba7e রিটার্ন করতে হবে।14 * স্টেট পরিবর্তন করা যাবে না (solc < 0.5 এর জন্য STATICCALL, solc > 0.5 এর জন্য view মডিফায়ার ব্যবহার করে)15 * এক্সটার্নাল কল করার অনুমতি দিতে হবে */16 function isValidSignature(17 bytes32 _hash,18 bytes memory _signature)19 public20 view21 returns (bytes4 magicValue);22}সব দেখানউদাহরণস্বরূপ EIP-1271 ইমপ্লিমেন্টেশন: Safe
কন্ট্রাক্টগুলো বিভিন্ন উপায়ে isValidSignature ইমপ্লিমেন্ট করতে পারে — স্পেসিফিকেশন শুধুমাত্র সঠিক ইমপ্লিমেন্টেশন সম্পর্কে খুব বেশি কিছু বলে না।
EIP-1271 ইমপ্লিমেন্ট করে এমন একটি উল্লেখযোগ্য কন্ট্রাক্ট হলো Safe (পূর্বে Gnosis Safe)।
Safe-এর কোডে, isValidSignature এমনভাবে ইমপ্লিমেন্ট করা হয়েছে (opens in a new tab) যাতে সিগনেচারগুলো দুটি উপায়ে (opens in a new tab) তৈরি এবং ভেরিফাই করা যায়:
- অনচেইন মেসেজ
- তৈরি করা: একজন Safe মালিক একটি মেসেজ "সাইন" করার জন্য একটি নতুন Safe লেনদেন তৈরি করেন, যেখানে মেসেজটিকে ডাটা হিসেবে লেনদেনে পাস করা হয়। মাল্টিসিগ থ্রেশহোল্ডে পৌঁছানোর জন্য পর্যাপ্ত মালিকরা লেনদেনে সাইন করলে, লেনদেনটি ব্রডকাস্ট এবং রান করা হয়। লেনদেনে, (
signMessage(bytes calldata _data)) নামের একটি Safe ফাংশন রয়েছে যা মেসেজটিকে "অনুমোদিত" মেসেজের তালিকায় যুক্ত করে। - ভেরিফিকেশন: Safe কন্ট্রাক্টে
isValidSignatureকল করুন, এবং মেসেজ প্যারামিটার হিসেবে ভেরিফাই করার জন্য মেসেজটি পাস করুন এবং সিগনেচার প্যারামিটারের জন্য একটি খালি ভ্যালু (opens in a new tab) (অর্থাৎ,0x) পাস করুন। Safe দেখবে যে সিগনেচার প্যারামিটারটি খালি এবং ক্রিপ্টোগ্রাফিকভাবে সিগনেচার ভেরিফাই করার পরিবর্তে, এটি বুঝতে পারবে যে মেসেজটি "অনুমোদিত" মেসেজের তালিকায় আছে কিনা তা চেক করতে হবে।
- তৈরি করা: একজন Safe মালিক একটি মেসেজ "সাইন" করার জন্য একটি নতুন Safe লেনদেন তৈরি করেন, যেখানে মেসেজটিকে ডাটা হিসেবে লেনদেনে পাস করা হয়। মাল্টিসিগ থ্রেশহোল্ডে পৌঁছানোর জন্য পর্যাপ্ত মালিকরা লেনদেনে সাইন করলে, লেনদেনটি ব্রডকাস্ট এবং রান করা হয়। লেনদেনে, (
- অফচেইন মেসেজ:
- তৈরি করা: একজন Safe মালিক অফচেইন একটি মেসেজ তৈরি করেন, তারপর মাল্টিসিগ অনুমোদনের থ্রেশহোল্ড অতিক্রম করার জন্য পর্যাপ্ত সিগনেচার না হওয়া পর্যন্ত অন্যান্য Safe মালিকদের দিয়ে মেসেজটিতে আলাদাভাবে সাইন করান।
- ভেরিফিকেশন:
isValidSignatureকল করুন। মেসেজ প্যারামিটারে, ভেরিফাই করার জন্য মেসেজটি পাস করুন। সিগনেচার প্যারামিটারে, প্রতিটি Safe মালিকের আলাদা সিগনেচারগুলো একসাথে যুক্ত করে পাস করুন। Safe চেক করবে যে থ্রেশহোল্ড পূরণ করার জন্য পর্যাপ্ত সিগনেচার আছে কিনা এবং প্রতিটি সিগনেচার বৈধ কিনা। যদি তাই হয়, তবে এটি সফল সিগনেচার ভেরিফিকেশন নির্দেশ করে একটি ভ্যালু রিটার্ন করবে।
_hash প্যারামিটারটি আসলে কী? পুরো মেসেজটি কেন পাস করা হয় না?
আপনি হয়তো লক্ষ্য করেছেন যে EIP-1271 ইন্টারফেসের (opens in a new tab) isValidSignature ফাংশনটি মেসেজটি নিজে গ্রহণ করে না, বরং এর পরিবর্তে একটি _hash প্যারামিটার গ্রহণ করে। এর মানে হলো isValidSignature-এ সম্পূর্ণ ইচ্ছামতো দৈর্ঘ্যের মেসেজ পাস করার পরিবর্তে, আমরা মেসেজটির একটি ৩২-বাইট হ্যাস (সাধারণত keccak256) পাস করি।
কলডাটার প্রতিটি বাইট — অর্থাৎ, স্মার্ট কন্ট্রাক্ট ফাংশনে পাস করা ফাংশন প্যারামিটার ডাটা — ১৬ গ্যাস খরচ করে (শূন্য বাইট হলে ৪ গ্যাস) (opens in a new tab), তাই মেসেজটি দীর্ঘ হলে এটি প্রচুর গ্যাস বাঁচাতে পারে।
পূর্ববর্তী EIP-1271 স্পেসিফিকেশন
এমন কিছু EIP-1271 স্পেসিফিকেশন প্রচলিত আছে যেগুলোতে isValidSignature ফাংশনের প্রথম প্যারামিটারটি bytes টাইপের (নির্দিষ্ট দৈর্ঘ্যের bytes32 এর পরিবর্তে ইচ্ছামতো দৈর্ঘ্যের) এবং প্যারামিটারের নাম message। এটি EIP-1271 স্ট্যান্ডার্ডের একটি পুরানো সংস্করণ (opens in a new tab)।
আমার নিজের কন্ট্রাক্টগুলোতে EIP-1271 কীভাবে ইমপ্লিমেন্ট করা উচিত?
স্পেসিফিকেশনটি এখানে বেশ উন্মুক্ত। Safe ইমপ্লিমেন্টেশনে কিছু ভালো ধারণা রয়েছে:
- আপনি কন্ট্রাক্টের "মালিকের" কাছ থেকে আসা EOA সিগনেচারগুলোকে বৈধ হিসেবে বিবেচনা করতে পারেন।
- আপনি অনুমোদিত মেসেজগুলোর একটি তালিকা সংরক্ষণ করতে পারেন এবং শুধুমাত্র সেগুলোকে বৈধ হিসেবে বিবেচনা করতে পারেন।
পরিশেষে, কন্ট্রাক্ট ডেভেলপার হিসেবে এটি আপনার ওপর নির্ভর করে!
উপসংহার
EIP-1271 (opens in a new tab) হলো একটি বহুমুখী স্ট্যান্ডার্ড যা স্মার্ট কন্ট্রাক্টগুলোকে সিগনেচার ভেরিফাই করার অনুমতি দেয়। এটি স্মার্ট কন্ট্রাক্টগুলোর জন্য EOA-এর মতো আরও বেশি কাজ করার দরজা খুলে দেয় — উদাহরণস্বরূপ স্মার্ট কন্ট্রাক্টগুলোর সাথে "Log in with Ethereum" কাজ করার একটি উপায় প্রদান করে — এবং এটি বিভিন্ন উপায়ে ইমপ্লিমেন্ট করা যেতে পারে (বিবেচনা করার জন্য Safe-এর একটি গুরুত্বপূর্ণ, আকর্ষণীয় ইমপ্লিমেন্টেশন রয়েছে)।
পেজ সর্বশেষ আপডেট: ১৬ জানুয়ারী, ২০২৬