সাইন লিংক

একটি সাইন লিংক Hivesigner-এ একটি Hive লেনদেন খোলে। ব্যবহারকারী সেটি পর্যালোচনা করেন, নিজের কী দিয়ে অনুমোদন দেন আর Hivesigner সেটি তার ব্রাউজার থেকে ব্রডকাস্ট করে। তারপর Hivesigner ব্যবহারকারীকে লেনদেনের আইডিসহ আপনার অ্যাপে ফেরত পাঠাতে পারে। সাইন লিংকের জন্য কোনো অ্যাপ অ্যাকাউন্ট বা টোকেন লাগে না। Hivesigner যে ৪১টি অপারেশন সমর্থন করে সবই এতে আছে, যার মধ্যে স্থানান্তর আর অ্যাক্টিভ কী লাগে এমন অন্যান্য কাজও আছে।

সাইন লিংক কীভাবে কাজ করে

  1. আপনার অ্যাপ এমন একটি লিংক বানায় যাতে এক বা একাধিক অপারেশন থাকে।
  2. ব্যবহারকারী লিংকটি খোলেন। Hivesigner "লেনদেন নিশ্চিত করুন" পর্দায় প্রতিটি অপারেশন সহজ ভাষায় দেখায়, সঙ্গে প্রয়োজনীয় কী।
  3. ব্যবহারকারী অনুমোদন দেন। Hivesigner-এ নির্বাচিত অ্যাকাউন্টের কী দিয়ে Hivesigner ব্রাউজারেই লেনদেনটি সাইন করে। তারপর লেনদেনটি Hive নেটওয়ার্কে পাঠায়।
  4. লিংকে কোনো কলব্যাক থাকলে 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 ওনার অ্যাকাউন্ট পুনরুদ্ধার