Wallet security

Wallet popup সব এক নয়: Connect, message sign, approval ও transfer আলাদা করুন

Wallet popup সব এক নয়: Connect, message sign, approval ও transfer আলাদা করুন

Website-এর button-এ “Continue” লেখা থাকলেও wallet popup আপনাকে login message, token allowance, NFT operator permission কিংবা সরাসরি asset transfer—যেকোনোটি চাইতে পারে। সিদ্ধান্ত নেওয়ার জায়গা button নয়; popup-এর network, method, contract, spender, amount এবং message। এই field পড়ার অভ্যাস project-এর জনপ্রিয়তার চেয়ে বেশি সুরক্ষা দেয়।

Wallet request-এর ধরন দ্রুত বোঝার উপায় কী?

Popup-এ gas, message, spender, asset change ও contract call আছে কি না দেখুন। Address connect সাধারণত gas চায় না। Message signature সরাসরি block-এ যায় না। Approve ও transfer on-chain transaction। Permit signature gas ছাড়াই তৈরি হতে পারে, কিন্তু পরে অন্য কেউ chain-এ submit করে allowance চালু করতে পারে।

RequestPopup-এ যা দেখা যায়Chain-এ যায়?মূল ঝুঁকি
ConnectAccount/address accessনাAddress ও website identity link হয়
personal_signReadable বা hex messageSignature নিজে নয়Login বা off-chain consent
EIP-712Domain ও structured fieldsSignature নিজে নয়Order, permit বা delegation
approveAllow spender to use tokenহ্যাঁAllowance-এর মধ্যে token ব্যবহার
permitOwner, spender, value, deadlineপরে submit হতে পারেGas ছাড়া allowance তৈরি
TransactionTo, value, gas, dataহ্যাঁAsset movement বা contract state change

Wallet UI ভেদে wording বদলায়। “Details”, “Data”, “Permission” বা “Advanced” section খুলুন। গুরুত্বপূর্ণ field লুকানো থাকলে website-এর নিজের reassurance-কে প্রমাণ ভাববেন না। Request reject করলে legitimate asset হারায় না; আবার official flow শুরু করা যায়।

শুধু Connect Wallet করলে website কী জানতে পারে?

Connect সাধারণত নির্বাচিত public address, active chain ও wallet capability প্রকাশ করে; এটি নিজে token spending permission নয়। তবু privacy-এর দিক থেকে এটি শূন্য ঝুঁকি নয়। Public address-এর transaction history দেখা যায় এবং website সেটিকে browser session, social account বা task profile-এর সঙ্গে যুক্ত করতে পারে।

Testnet-এর জন্য আলাদা wallet রাখলে main holding address-এর সঙ্গে অপ্রয়োজনীয় link কমে। আলাদা wallet মানে একই seed-এর আরেক account নাকি সম্পূর্ণ আলাদা seed—এই পার্থক্য বুঝুন। একই seed থেকে তৈরি account-গুলোর ownership সরাসরি public নয়, কিন্তু ব্যবহারের pattern, fund transfer বা common contract interaction link তৈরি করতে পারে। High-value wallet কোনো অজানা campaign page-এ connect না করাই ভালো।

Connect confirm করার পর পরের popup-কে নতুন request হিসেবে দেখুন। Phishing page প্রথমে harmless connection দেখিয়ে user-এর guard নামায়, তারপর approve বা permit চায়। প্রথম popup নিরাপদ ছিল বলে দ্বিতীয়টিও নিরাপদ—এমন কোনো নিয়ম নেই। Page যদি একের পর এক popup দেয়, প্রতিটি cancel করে official documentation-এ expected steps পড়ুন।

Wallet-এর “Connected sites” থেকে disconnect করলে website session শেষ হয়, কিন্তু পুরোনো on-chain approval থাকে। Privacy connection এবং blockchain allowance দুইটি আলাদা record। Browser history clear করা, wallet lock করা বা extension reinstall করাও approve revoke করে না।

personal_sign login message কতটা নিরাপদ?

Readable, নির্দিষ্ট domain ও purpose-সহ, nonce থাকা login message সাধারণত সীমিত কাজের জন্য ব্যবহৃত হয়; তবু blind sign করবেন না। EIP-191 signed data-তে prefix যোগ করে message-কে সাধারণ transaction থেকে আলাদা করার framework দেয়। এটি message-এর উদ্দেশ্য সৎ কি না যাচাই করে না।

ভালো login message-এ কী আশা করবেন

Service domain, wallet address, login statement, random nonce, issued time এবং প্রয়োজন হলে expiry দেখা উচিত। Browser domain এবং message domain একই কি না দেখুন। “Sign in to example.org” যুক্তিসঙ্গত; কিন্তু সম্পূর্ণ অন্য domain, open-ended terms বা অজানা asset claim থাকলে reject করুন। Nonce replay কমায়, তবে implementation ঠিক কি না user popup দেখে পুরোপুরি প্রমাণ করতে পারে না। তাই source-ও যাচাই করতে হবে।

Gas zero মানে risk zero নয়

Message sign করতে gas লাগে না কারণ signature local wallet-এ তৈরি হয়। Signature দিয়ে service প্রমাণ করতে পারে address controller কোনো statement মেনেছে। Malicious site এটিকে login token, marketplace order বা অন্য authorization হিসেবে ব্যবহার করতে পারে। “No gas” শুধু blockchain fee সম্পর্কে তথ্য; permission-এর মূল্য সম্পর্কে নয়।

Hex message এলে কী করবেন

Human-readable text না থাকলে sign না করে project docs-এ exact method খুঁজুন। Hardware wallet screen-এ সব field না দেখালে desktop wallet interface-এ full payload দেখুন। Website-এর পাশে লেখা “safe verification” সেই payload-এর স্বাধীন ব্যাখ্যা নয়, কারণ request-টি website-ই বানিয়েছে।

Sign-in message-এ password, seed phrase বা OTP type করতে হয় না। Wallet নিজে signature দেয়। Page আলাদা form-এ secret চাইলে flow বন্ধ করুন। Genuine support আপনার seed phrase দিয়ে login troubleshoot করবে না।

EIP-712 typed data পরিষ্কার দেখালেও কোথায় ঝুঁকি থাকে?

EIP-712 field-কে structured করে যাতে wallet name ও value দেখাতে পারে; structured হওয়া permission-কে harmless করে না। Marketplace order, governance vote, token permit, smart account action ও delegation-এ typed data ব্যবহৃত হয়। Domain এবং message দুই অংশ পড়ুন।

Domain section

Name, version, chainId এবং verifyingContract দেখুন। Website mainnet task বললেও chainId অন্য হলে থামুন। Contract address official docs বা verified explorer page-এর সঙ্গে মিলতে হবে। Name field কেবল text, scammer সেটি copy করতে পারে; contract address ও chain context বেশি গুরুত্বপূর্ণ।

Message section

Owner আপনার address কি না, spender বা operator কে, value কত, token কোনটি, deadline কখন, nonce কী—সব দেখুন। Large integer scientific notation-এ থাকলে wallet details খুলুন এবং token decimals বুঝে amount হিসাব করুন। Unknown spender-কে unlimited value দেওয়া আর ছোট test amount দেওয়া একই risk নয়।

Deadline ও nonce

Deadline সীমাহীন হলে signature অনেক পরে ব্যবহার হতে পারে। খুব ছোট deadline usability problem তৈরি করতে পারে, কিন্তু reasonable expiry context-dependent। Nonce সাধারণত replay আটকায়; contract কীভাবে nonce ব্যবহার করে তা implementation-এর উপর নির্ভরশীল। User হিসেবে official contract ও documented flow না পেলে request reject করাই নিরাপদ।

EIP-712 সুন্দর table দেখায় বলে এটিকে পরিচয় verification ধরে নেওয়া ভুল। Field-এর নাম “Login” হলেও underlying type permit হতে পারে। Wallet যে method ও contract দেখায় সেটি পড়ুন; website button বা social post নয়।

approve, permit এবং setApprovalForAll কীভাবে আলাদা?

তিনটিই অন্য address-কে asset-এর উপর কিছু ক্ষমতা দিতে পারে; target asset ও submission path আলাদা। ERC-20 approve spender-কে নির্দিষ্ট allowance দেয়। EIP-2612 permit signature দিয়ে allowance প্রকাশ করে, পরে relayer chain-এ দিতে পারে। NFT setApprovalForAll operator-কে একটি collection-এর সব token পরিচালনার permission দিতে পারে।

Approve পড়ার নিয়ম

Token contract, spender এবং amount মিলান। Approve একটি on-chain transaction বলে gas দেখাবে। Unlimited allowance future interaction সহজ করে, কিন্তু spender compromise, contract upgrade বা malicious feature হলে exposure বাড়ায়। Testnet page যদি mainnet stablecoin approval চায়, সেটা expected task-এর সঙ্গে মেলে না। Network switch notice এড়িয়ে confirm করবেন না।

Permit-এর নীরবতা কেন বিপজ্জনক

Permit sign করার সময়ে gas লাগে না এবং wallet কখনও “signature request” বলেই দেখায়। কিন্তু owner, spender, value ও deadline মিলিয়ে এটি কার্যত spending allowance হতে পারে। Attacker signature পেয়ে নিজে transaction submit করতে পারে। Disconnect করে permit বাতিল হয় না। সন্দেহ হলে chain-এ submit হয়েছে কি না দেখুন এবং token/wallet support অনুযায়ী nonce invalidation, zero allowance বা asset relocation বিবেচনা করুন।

NFT operator permission

setApprovalForAll একটি NFT নয়, collection-এর সব NFT cover করতে পারে। “Verify ownership” বা “mint pass” লেখা page-এ এমন request এলে official docs-এ reason খুঁজুন। Test badge mint-এর জন্য mainnet collection-wide approval সাধারণত যুক্তিযুক্ত নয়। Wallet warning ছোট করে না দেখে operator address compare করুন।

Approval chain-এ থাকলে website বন্ধ হয়ে গেলেও permission থাকে। Allowance ব্যবহার হয়ে শেষ হতে পারে, user zero করতে পারে, অথবা contract-specific rule বদলাতে পারে। শুধু app uninstall বা account disconnect permission সরায় না। Periodic fixed promise নয়—উচ্চ privilege interaction-এর পরে এবং project শেষ করলে review করুন।

Transaction confirm popup-এ কোন field বাদ দেওয়া যাবে না?

Network, From, To, value, token change, contract method ও expected result মিলান। “Claim”, “Mint” বা “Verify” button transaction-এর আইনগত বা technical অর্থ নির্ধারণ করে না। Wallet data-তে transferFrom, multicall বা unknown method থাকলে page text-এর বাইরে গিয়ে বুঝতে হবে।

  1. Chain ID expected testnet কি না দেখুন। Mainnet gas symbol দেখলে stop করুন।
  2. From address আপনার test wallet কি না দেখুন; main wallet selected থাকলে cancel করুন।
  3. To address official contract অথবা expected recipient-এর সঙ্গে মিলান।
  4. Native value শূন্য না হলে কেন asset পাঠানো হচ্ছে বুঝুন।
  5. Token/NFT change section-এ outgoing asset আছে কি না দেখুন।
  6. Method এবং parameter current task-এর সঙ্গে সম্পর্কিত কি না পড়ুন।
  7. Simulation থাকলে expected changes দেখুন, কিন্তু simulation-কে guarantee ভাববেন না।

Gas fee ছোট হলেও malicious transfer নিরাপদ হয় না। Gas network execution cost, asset risk score নয়। একইভাবে failed simulation সবসময় scam প্রমাণ করে না; RPC বা unsupported decoder কারণ হতে পারে। Conflict দেখলে confirm না করে official technical channel-এ hash-less request details দিন।

Upgradeable proxy contract-এর logic পরে বদলাতে পারে। Simulation বর্তমান state দেখে; delayed execution, signature reuse বা later upgrade সবসময় ধরতে পারে না। তাই contract source, official announcement ও limited permission গুরুত্বপূর্ণ।

প্রতিবার sign করার আগে ছয় ধাপ কীভাবে মনে রাখবেন?

Domain—network—request type—target—scope—exit path এই order অনুসরণ করুন। Project logo, follower count বা বন্ধুর assurance-এর চেয়ে repeatable checklist বেশি কার্যকর।

  1. Domain: Official website বা docs থেকে প্রবেশ করুন; spelling ও subdomain দেখুন।
  2. Network: Chain ID ও selected account দেখুন; test wallet আলাদা রাখুন।
  3. Type: Connect, message, typed data, allowance নাকি transaction নির্ধারণ করুন।
  4. Target: Contract, spender, operator, recipient ও token যাচাই করুন।
  5. Scope: Amount, unlimited flag, NFT collection, deadline ও replay possibility বুঝুন।
  6. Exit: কীভাবে disconnect, revoke, cancel বা project থেকে বের হবেন জানুন।

একটি field বোঝা না গেলে wallet-এর details খুলুন। তাও অস্পষ্ট হলে request বাতিল করুন। Uncertain airdrop-এর জন্য main wallet permission দেওয়া risk-reward হিসেবে দুর্বল সিদ্ধান্ত। Legitimate project user-কে প্রশ্ন করার সময় দেয়; countdown বা private admin pressure নিরাপত্তার বিপরীত।

Mobile device-এ screen ছোট হওয়ায় address truncate হয়। Clipboard-এ copy করে official address-এর সঙ্গে পূর্ণ comparison করুন, কিন্তু public chat-এ paste করবেন না। WalletConnect QR public screen-এ দেখাবেন না; session hijack risk থাকতে পারে। Shared phone-এ wallet import করবেন না।

ভুল sign বা approval হয়ে গেলে কোন কাজ আগে করবেন?

নতুন request বন্ধ করুন, তারপর signed item-এর ধরন অনুযায়ী ব্যবস্থা নিন। Page বন্ধ ও disconnect করলে future popup থামে; on-chain approval সরাতে আলাদা action লাগে। Valuable asset risk-এ থাকলে নতুন seed থেকে তৈরি clean wallet-এ asset সরানো revocation-এর চেয়ে বেশি জরুরি হতে পারে।

  • শুধু connect: Connected site remove করুন, session logout করুন, unusual request নজরে রাখুন।
  • Login message: সংশ্লিষ্ট service session revoke করুন, linked account password/2FA review করুন, official support-এ domain জানান।
  • Permit: Signature submit হয়েছে কি না explorer-এ দেখুন; token-specific revocation path নিন বা asset সরান।
  • Approve: Correct chain-এ spender allowance zero/revoke করুন এবং transaction history দেখুন।
  • setApprovalForAll: Collection-এর operator approval revoke করুন; অন্য collection আলাদা করে পরীক্ষা করুন।
  • Asset transfer: Blockchain transaction সাধারণত ফিরিয়ে আনা যায় না। Hash সংরক্ষণ করুন, platform ও উপযুক্ত authority-তে report করুন; recovery scam-এ fee দেবেন না।

Seed phrase “scan” করার জন্য কোনো website-এ দেবেন না। Remote-control app install করে stranger-কে wallet দেখাবেন না। Legitimate helper public hash, contract ও error দিয়ে analysis করতে পারে। Panic-এর সময় second scam হওয়ার আশঙ্কা বেশি, তাই written checklist ধরে এগোন।

তিনটি ছোট scenario

Scenario 1: Airdrop page শুধু login চায়

Wallet readable message দেখায়, domain browser-এর সঙ্গে মেলে, nonce ও issued time আছে, asset/allowance field নেই। Risk তুলনামূলক কম, তবু address linkage গ্রহণযোগ্য কি না ভাবুন। Main holding wallet-এর বদলে isolated activity wallet ভালো হতে পারে।

Scenario 2: Testnet swap-এর আগে unlimited approval

Network testnet, token test asset, spender official router। এটি expected হতে পারে, কিন্তু unlimited amount বাধ্যতামূলক কি না দেখুন। Wallet custom limit দিলে প্রয়োজনীয় amount দিন। Task শেষে approval review করুন।

Scenario 3: “Verify wallet” button mainnet permit চায়

Page test reward বললেও typed data-তে mainnet chainId, stablecoin contract ও unfamiliar spender দেখা যায়। Gas নেই বলে safe নয়; এটি reject করার স্পষ্ট কারণ। Domain report করুন এবং wallet history দেখুন অন্য কোনো signature দেওয়া হয়েছিল কি না।

সাধারণ প্রশ্ন

শুধু wallet connect করলে কি asset চলে যেতে পারে?

সাধারণ connect request শুধু নির্বাচিত public address ও network website-কে দেখায়; এটি নিজে transfer নয়। তবে connect হওয়ার পর page আলাদা signature, approval বা transaction চাইতে পারে, তাই প্রতিটি পরের popup নতুন করে পড়তে হবে।

personal_sign কি সবসময় নিরাপদ?

না। পরিষ্কার login message সাধারণত সরাসরি asset সরায় না, কিন্তু signature login বা অন্য off-chain authorization হিসেবে ব্যবহৃত হতে পারে। Domain, purpose, nonce বা মেয়াদ অস্পষ্ট হলে reject করুন।

approve আর permit-এর সাধারণ ঝুঁকি কী?

দুটিই নির্দিষ্ট spender-কে token ব্যবহারের permission দিতে পারে। Approve একটি on-chain transaction; permit signature পরে অন্য কেউ submit করতে পারে। Token, spender, amount, chain ও deadline পরীক্ষা করতে হবে।

Wallet simulation safe দেখালে কি confirm করা যায়?

Simulation সহায়ক, নিশ্চয়তা নয়। Upgradeable contract, delayed signature submission, unknown decoder বা পরের call-এর ঝুঁকি বাদ পড়তে পারে। Domain, contract ও permission নিজে যাচাই করেই সিদ্ধান্ত নিন।

Primary technical sources