সাইন লিংক
একটি সাইন লিংক Hivesigner-এ একটি Hive লেনদেন খোলে। ব্যবহারকারী সেটি পর্যালোচনা করেন, নিজের কী দিয়ে অনুমোদন দেন আর Hivesigner সেটি তার ব্রাউজার থেকে ব্রডকাস্ট করে। তারপর Hivesigner ব্যবহারকারীকে লেনদেনের আইডিসহ আপনার অ্যাপে ফেরত পাঠাতে পারে। সাইন লিংকের জন্য কোনো অ্যাপ অ্যাকাউন্ট বা টোকেন লাগে না। Hivesigner যে ৪১টি অপারেশন সমর্থন করে সবই এতে আছে, যার মধ্যে স্থানান্তর আর অ্যাক্টিভ কী লাগে এমন অন্যান্য কাজও আছে।
সাইন লিংক কীভাবে কাজ করে
- আপনার অ্যাপ এমন একটি লিংক বানায় যাতে এক বা একাধিক অপারেশন থাকে।
- ব্যবহারকারী লিংকটি খোলেন। Hivesigner "লেনদেন নিশ্চিত করুন" পর্দায় প্রতিটি অপারেশন সহজ ভাষায় দেখায়, সঙ্গে প্রয়োজনীয় কী।
- ব্যবহারকারী অনুমোদন দেন। Hivesigner-এ নির্বাচিত অ্যাকাউন্টের কী দিয়ে Hivesigner ব্রাউজারেই লেনদেনটি সাইন করে। তারপর লেনদেনটি Hive নেটওয়ার্কে পাঠায়।
- লিংকে কোনো কলব্যাক থাকলে Hivesigner ব্যবহারকারীকে লেনদেনের আইডিসহ সেখানে পাঠায়।
আপনার অ্যাপ কখনও কোনো কী দেখে না। যে কোনো সাইট সাইন লিংক বানাতে পারে: পাঠানোর মতো কোনো client_id নেই।
লিংকের ধরন
Hivesigner দুই ধরনের সাইন লিংক পড়ে: এনকোড করা লিংক আর পুরনো লিংক।
এনকোড করা লিংক
এনকোড করা লিংক অপারেশনগুলো JSON হিসেবে বহন করে, base64url-এ এনকোড করে। এটি hive-uri প্যাকেজের hive://sign/... ফরম্যাট ব্যবহার করে, যেখানে hive://-এর জায়গায় থাকে https://hivesigner.com/।
| ধরন | B64U-তে যা থাকে |
|---|---|
https://hivesigner.com/sign/op/B64U |
একটি অপারেশন: ["vote", {...}] |
https://hivesigner.com/sign/ops/B64U |
অপারেশনের একটি তালিকা: [["transfer", {...}], ["transfer", {...}]] |
https://hivesigner.com/sign/tx/B64U |
একটি পূর্ণ লেনদেন, তার নিজের হেডারসহ |
B64U হলো JSON লেখাটি, UTF-8 হিসেবে এনকোড করা, তারপর base64-এ, যেখানে + হয় -, / হয় _ আর = প্যাডিং হয় .।
op আর ops-এর জন্য Hivesigner অপারেশনগুলোর চারপাশে লেনদেনটি গড়ে তোলে। সে রেফারেন্স ব্লক আর মেয়াদ বসিয়ে দেয়।
tx-এর জন্য Hivesigner লেনদেনের নিজের ref_block_num, ref_block_prefix আর expiration রেখে দেয়। লেনদেনে আগে থেকে থাকা স্বাক্ষরগুলোও রেখে দেয়। এতে একাধিক অ্যাকাউন্ট পালা করে একটি লেনদেন সাইন করতে পারে, এমন অ্যাকাউন্টের জন্য যা কয়েকজন মিলে নিয়ন্ত্রণ করেন। যার extensions তালিকা ফাঁকা নয় এমন লেনদেন Hivesigner প্রত্যাখ্যান করে।
নোট: সাইন করার আগে Hivesigner কিছু মান একরকম করে নেয়, যেমন পরিমাণ আর ডিফল্টে রেখে দেওয়া ফিল্ড। তাই সাইন করা লেনদেনের আইডি আপনার বানানো আইডি থেকে আলাদা হতে পারে। আইডিটি কলব্যাক থেকে পড়ুন।
পুরনো লিংক
পুরনো লিংক পাথে একটি অপারেশনের নাম রাখে আর তার ফিল্ডগুলো কোয়েরিতে রাখে:
https://hivesigner.com/sign/vote?author=AUTHOR&permlink=PERMLINK&weight=10000
https://hivesigner.com/sign/transfer?to=RECIPIENT&amount=1.000%20HIVE&memo=MEMO
https://hivesigner.com/sign/transfer-to-vesting?amount=10.000%20HIVE
- অপারেশনের নাম লিখুন snake case (
transfer_to_vesting), camel case (transferToVesting) বা kebab case (transfer-to-vesting)-এ। - প্রতিটি ফিল্ড ফিল্ডের নামেই কোয়েরি প্যারামিটার হিসেবে দিন। প্রতিটি মান URL-এনকোড করুন।
- তালিকা আর অবজেক্ট JSON হিসেবে লিখুন, যেমন
required_posting_auths=["alice"]। আইডি বা নামের তালিকা কমা দিয়েও আলাদা করা যায়:proposal_ids=379,380। - বুলিয়ান লিখুন
trueবাfalse।
পুরনো লিংকে একটিমাত্র অপারেশন থাকে। একাধিকের জন্য এনকোড করা লিংক ব্যবহার করুন।
ফিল্ডের মান
এই নিয়মগুলো সব ধরনের ক্ষেত্রেই খাটে:
- ডিফল্ট। আপনি যে ফিল্ড বাদ দেন সেটি তার ডিফল্ট মান নেয়। যে অ্যাকাউন্ট কাজ করে (
voter,from,ownerআর এ ধরনের ফিল্ড) তার ডিফল্ট হলো যে অ্যাকাউন্ট সাইন করে। ভোটেরweight-এর ডিফল্ট10000(100%)। - পরিমাণ হলো একটি সংখ্যা আর একটি প্রতীক:
1.000 HIVE,0.500 HBDবা100.000000 VESTS। Hivesigner HIVE আর HBD লেখে ৩ দশমিক ঘরে আর VESTS লেখে ৬ ঘরে। - Hive Power। VESTS নেয় এমন ফিল্ড HP-তে পরিমাণও নেয়, যেমন
100 HP। ব্যবহারকারী অনুমোদন দেওয়ার আগেই Hivesigner সেটিকে বর্তমান হারে VESTS-এ বদলে নেয়। __signerযে কোনো মানে থাকলে তা যে অ্যাকাউন্ট সাইন করে তার নাম হয়ে যায়। যেমন অনুসরণের একটিcustom_jsonতারjson-এর ভেতরে অনুসরণকারী হিসেবে__signerলিখতে পারে।- পূর্ণসংখ্যা চেইন যে সীমা মানে তার মধ্যে পূর্ণ সংখ্যা হতে হবে, যেমন ভোটের
weight-এর জন্য-10000থেকে10000।
কোনো মান তার ফিল্ডে না খাটলে, অপারেশন অজানা হলে, বা লিংকে কোনো অপারেশন না থাকলে Hivesigner পুরো লিংকটিই প্রত্যাখ্যান করে। ব্যবহারকারী দেখেন "দুঃখিত, কিছু একটা ভুল হয়েছে। প্রদত্ত ডেটা অবৈধ।" আর কিছুই সাইন হয় না।
প্যারামিটার
যে কোনো সাইন লিংকের কোয়েরি স্ট্রিংয়ে এগুলো যোগ করুন:
| প্যারামিটার | অর্থ |
|---|---|
cb |
কলব্যাক URL, base64url-এ এনকোড করা। hive-uri তার callback অপশনের জন্য এটিই লেখে। |
redirect_uri |
কলব্যাক URL সাধারণ URL-এনকোড করা লেখা হিসেবে। পুরনো লিংক এটিই ব্যবহার করে। এনকোড করা লিংক এটি ব্যবহার করে যখন তার cb নেই। |
nb |
শুধু সাইন। Hivesigner লেনদেনটি ব্রডকাস্ট না করেই সাইন করে। স্বাক্ষর পেতে কলব্যাকে {{sig}} বসান (দেখুন কলব্যাকের স্থানধারক)। যে কোনো মানই চলে, এমনকি ফাঁকাও (nb=)। |
s |
যে অ্যাকাউন্টকে সাইন করতে হবে। অন্য অ্যাকাউন্ট নির্বাচিত থাকলে Hivesigner ব্যবহারকারীকে এটিতে বদলাতে বলে। অন্য কোনো অ্যাকাউন্ট দিয়ে সে সাইন করে না। |
https:// কলব্যাক ব্যবহার করুন। যে কলব্যাক http বা https URL নয় Hivesigner সেটি উপেক্ষা করে আর তখন নিজের ফলাফলের পর্দাতেই থেকে যায়।
Hivesigner অপারেশন দেখে কী বেছে নেয়। সেটি বাছার কোনো প্যারামিটার নেই: সাইন লিংকে Hivesigner authority (আর hive-uri-র a প্যারামিটার) উপেক্ষা করে। দেখুন লিংকে কোন কী লাগে।
কলব্যাকের স্থানধারক
ব্যবহারকারী অনুমোদন দেওয়ার পর Hivesigner কলব্যাকে এই স্থানধারকগুলো পূরণ করে:
| স্থানধারক | মান |
|---|---|
{{id}} |
লেনদেনের আইডি |
{{sig}} |
স্বাক্ষর, শুধু-সাইন (nb) লিংকের জন্য |
{{block}} |
ফাঁকা রাখা হয় |
{{txn}} |
ফাঁকা রাখা হয় |
{{data}} |
ফাঁকা রাখা হয় |
এগুলোর কোনোটিই নেই এমন কলব্যাক ? বা &-এর পরে id হিসেবে লেনদেনের আইডি পায়:
https://YOUR_APP/done becomes https://YOUR_APP/done?id=TRANSACTION_ID
https://YOUR_APP/done?step=2 becomes https://YOUR_APP/done?step=2&id=TRANSACTION_ID
https://YOUR_APP/tx/{{id}} becomes https://YOUR_APP/tx/TRANSACTION_ID
কোনো Hive নোড লেনদেনটি গ্রহণ করলেই Hivesigner রিডাইরেক্ট করে। লেনদেনটি তখনও ব্লকে না থাকতে পারে। এটি অন্তর্ভুক্ত হয়েছে কি না জানা দরকার হলে আইডি দিয়ে খুঁজে দেখুন।
নেটওয়ার্ক লেনদেনটি প্রত্যাখ্যান করলে (ব্যবহারকারী ত্রুটিটি দেখেন) বা ব্যবহারকারী অনুমোদন না দিয়েই চলে গেলে আপনার কলব্যাক ডাকা হয় না।
একটি লিংক বানান
hive-uri দিয়ে
hive-uri প্যাকেজ (https://www.npmjs.com/package/hive-uri) অপারেশনগুলোকে লিংকে এনকোড করে। 0.2.8 বা তার পরের সংস্করণ ব্যবহার করুন, যা যে কোনো ইউনিকোড লেখা সঠিকভাবে এনকোড করে।
npm install hive-uri
import { encodeOp, encodeOps } from 'hive-uri';
// One vote. __signer becomes the account that signs.
const vote = encodeOp(
['vote', { voter: '__signer', author: 'AUTHOR', permlink: 'PERMLINK', weight: 10000 }],
{ callback: 'https://YOUR_APP/voted?tx={{id}}' },
);
// Two transfers in one transaction.
const payout = encodeOps(
[
['transfer', { from: '__signer', to: 'RECIPIENT_1', amount: '1.000 HIVE', memo: 'MEMO' }],
['transfer', { from: '__signer', to: 'RECIPIENT_2', amount: '2.000 HIVE', memo: 'MEMO' }],
],
{ callback: 'https://YOUR_APP/paid' },
);
const voteLink = vote.replace('hive://', 'https://hivesigner.com/');
const payoutLink = payout.replace('hive://', 'https://hivesigner.com/');
অপশন অবজেক্টটি নেয় callback (লেখা হয় cb), no_broadcast: true (লেখা হয় nb) আর signer (লেখা হয় s)। পূর্ণ লেনদেনের জন্য encodeTx একই কাজ করে।
JavaScript SDK দিয়ে
hivesigner প্যাকেজে আছে sendOperation, sendOperations আর sendTransaction। এগুলো hive-uri-র এনকোডারের মতো একই আর্গুমেন্ট নেয় আর https://hivesigner.com/sign/... লিংক ফেরত দেয়:
import { sendOperation } from 'hivesigner';
const link = sendOperation(
['transfer', { from: '__signer', to: 'RECIPIENT', amount: '1.000 HIVE', memo: 'MEMO' }],
{ callback: 'https://YOUR_APP/paid' },
);
TypeScript-এ টাইপগুলো তৃতীয় আর্গুমেন্ট চায়: লিংকটি ফেরত পেতে undefined দিন। ব্রাউজারে তৃতীয় আর্গুমেন্ট হিসেবে একটি ফাংশন দিলে সেগুলো লিংকটি ফেরত না দিয়ে নতুন ট্যাবে খোলে। দেখুন SDK।
কোড ছাড়াই
https://hivesigner.com/signs ("লেনদেন সাইন করুন") প্রতিটি সমর্থিত অপারেশন তার ফিল্ডের ফর্মসহ তালিকাভুক্ত করে। এটি একটি /sign/op/ লিংক বানায় আর খোলে।
লিংকে কোন কী লাগে
প্রতিটি অপারেশনে একটি কী লাগে: পোস্টিং, অ্যাক্টিভ বা ওনার। নিচের তালিকায় সেগুলো আছে। তিনটি অপারেশন তাদের মানের উপর নির্ভর করে:
required_auths-এ কোনো অ্যাকাউন্টের নাম থাকলেcustom_json-এ অ্যাক্টিভ কী লাগে। নয়তো পোস্টিং কী লাগে।ownerবসালেaccount_update-এ ওনার কী লাগে। নয়তো অ্যাক্টিভ কী লাগে।ownerবসালেaccount_update2-এ ওনার কী লাগে।active,posting,memo_keyবাjson_metadataবসালে অ্যাক্টিভ কী লাগে। শুধুposting_json_metadataহলে পোস্টিং কী লাগে।
Hivesigner একটিমাত্র কী দিয়ে একটি লিংক সাইন করে, তাই এক লিংকের সব অপারেশনে একই কী লাগতে হবে। যে লিংক সেগুলো মিশিয়ে ফেলে Hivesigner তা সাইন করতে অস্বীকার করে আর ব্যবহারকারীকে কারণ জানায়। এমন অপারেশন আলাদা লিংকে পাঠান।
নির্বাচিত অ্যাকাউন্টের কী ডিভাইসে না থাকলে Hivesigner বলে কোন কী নেই আর সেটি যোগ করার প্রস্তাব দেয়। দেখুন কী না থাকলে।
ব্যবহারকারী যা দেখেন
- "লেনদেন নিশ্চিত করুন" শিরোনামের একটি পর্দা, প্রতিটি অপারেশনের জন্য একটি করে কার্ড: সহজ ভাষায় সারসংক্ষেপ, প্রয়োজনীয় কী আর তাতে থাকা মানগুলো।
- লিংকে কলব্যাক থাকলে "আপনাকে HOST ঠিকানায় রিডাইরেক্ট করা হবে।"। আপনার নিজের সাইটের কলব্যাক ব্যবহার করুন, যাতে ব্যবহারকারীরা হোস্টটি চিনতে পারেন।
- কোনো অপারেশন যে অ্যাকাউন্ট সাইন করছে তার বদলে অন্য অ্যাকাউন্ট হিসেবে কাজ করলে একটি সতর্কবার্তা।
- অনুমোদন করুন, বা শুধু-সাইন লিংকের জন্য সাইন করুন। লক করা অ্যাকাউন্ট আগে তার পাসকোড চায়।
- ব্রডকাস্টের পর লেনদেনের আইডিসহ "লেনদেন সফলভাবে ব্রডকাস্ট করা হয়েছে"। তারপর আপনার কলব্যাকে রিডাইরেক্ট।
পর্যালোচনা ও সাইন পাতায় ব্যবহারকারীদের জন্য পর্দাটি বর্ণনা করা আছে।
সমর্থিত অপারেশন
Hivesigner এই ৪১টি অপারেশন সাইন করে, চেইনে তাদের নাম অনুসারে। এর বাইরে সবকিছু প্রত্যাখ্যাত। নামটি সেটিই যা Hivesigner নিশ্চিতকরণের পর্দায় দেখায়।
| অপারেশন | কী | নাম |
|---|---|---|
transfer |
অ্যাক্টিভ | স্থানান্তর |
recurrent_transfer |
অ্যাক্টিভ | পুনরাবৃত্ত স্থানান্তর |
delegate_vesting_shares |
অ্যাক্টিভ | Hive Power ডেলিগেট |
transfer_to_vesting |
অ্যাক্টিভ | পাওয়ার আপ |
set_withdraw_vesting_route |
অ্যাক্টিভ | পাওয়ার ডাউন রুট নির্ধারণ |
withdraw_vesting |
অ্যাক্টিভ | পাওয়ার ডাউন |
transfer_to_savings |
অ্যাক্টিভ | সঞ্চয়ে স্থানান্তর |
transfer_from_savings |
অ্যাক্টিভ | সঞ্চয় থেকে স্থানান্তর |
cancel_transfer_from_savings |
অ্যাক্টিভ | সঞ্চয় থেকে স্থানান্তর বাতিল |
convert |
অ্যাক্টিভ | HBD থেকে HIVE রূপান্তর |
collateralized_convert |
অ্যাক্টিভ | HIVE থেকে HBD রূপান্তর |
account_witness_vote |
অ্যাক্টিভ | উইটনেস ভোট |
witness_update |
অ্যাক্টিভ | উইটনেস আপডেট |
witness_set_properties |
অ্যাক্টিভ | উইটনেস বৈশিষ্ট্য নির্ধারণ |
account_witness_proxy |
অ্যাক্টিভ | গভর্ন্যান্স প্রক্সি |
claim_account |
অ্যাক্টিভ | অ্যাকাউন্ট ক্রেডিট ক্লেইম |
account_create |
অ্যাক্টিভ | অ্যাকাউন্ট তৈরি |
create_claimed_account |
অ্যাক্টিভ | অ্যাকাউন্ট ক্রেডিট দিয়ে অ্যাকাউন্ট তৈরি |
vote |
পোস্টিং | ভোট |
limit_order_create |
অ্যাক্টিভ | লিমিট অর্ডার তৈরি |
limit_order_create2 |
অ্যাক্টিভ | লিমিট অর্ডার তৈরি |
limit_order_cancel |
অ্যাক্টিভ | লিমিট অর্ডার বাতিল |
claim_reward_balance |
পোস্টিং | রিওয়ার্ড সংগ্রহ |
comment |
পোস্টিং | পোস্ট বা মন্তব্য |
comment_options |
পোস্টিং | পোস্ট বা মন্তব্যের অপশন |
custom_json |
পোস্টিং, বা required_auths বসানো থাকলে অ্যাক্টিভ |
কাস্টম অপারেশন |
delete_comment |
পোস্টিং | মন্তব্য মুছে ফেলা |
account_update |
অ্যাক্টিভ, বা owner বসানো থাকলে ওনার |
অ্যাকাউন্ট আপডেট (অ্যাক্টিভ) |
account_update2 |
পোস্টিং, অ্যাক্টিভ বা ওনার, ফিল্ড অনুসারে | অ্যাকাউন্ট আপডেট (পোস্টিং) |
change_recovery_account |
ওনার | রিকভারি অ্যাকাউন্ট পরিবর্তন |
create_proposal |
অ্যাক্টিভ | প্রস্তাব তৈরি |
remove_proposal |
অ্যাক্টিভ | প্রস্তাব সরানো |
update_proposal_votes |
অ্যাক্টিভ | প্রস্তাবের ভোট আপডেট |
update_proposal |
অ্যাক্টিভ | প্রস্তাব আপডেট |
escrow_transfer |
অ্যাক্টিভ | এসক্রো স্থানান্তর |
escrow_approve |
অ্যাক্টিভ | এসক্রো অনুমোদন |
escrow_dispute |
অ্যাক্টিভ | এসক্রো বিরোধ |
escrow_release |
অ্যাক্টিভ | এসক্রো মুক্তি |
account_create_with_delegation |
অ্যাক্টিভ | ডেলিগেশনসহ অ্যাকাউন্ট তৈরি |
request_account_recovery |
অ্যাক্টিভ | অ্যাকাউন্ট পুনরুদ্ধারের অনুরোধ |
recover_account |
ওনার | অ্যাকাউন্ট পুনরুদ্ধার |