كيفية إنشاء المعاملات الخام في Ethereum؟ - الجزء 1

في هذا المنشور ، سنكتشف كيفية إنشاء وتسجيل وإرسال المعاملات الأولية بين الحسابات باستخدام NodeJs.

المعاملات الأولية هي طريقة يمكننا من خلالها الفصل بين عملية إنشاء وتوقيع وإرسال المعاملات الأولية ، مما يمنحنا مزيدًا من التحكم في كيفية إجراء المعاملة على Ethereum. المعاملات الأولية تساعدنا على إنشاء معاملات خارج وحدة التحكم geth.

ما هي الصفقة تتكون من؟

عندما نرسل معاملة بين حسابين من وحدة تحكم geth ، نحتاج إلى 3 معلمات ، من الحساب إلى الحساب والقيمة. ولكن ، هناك بعض المعلمات أدناه ، والتي تملأ وحدة التحكم geth بالنسبة لنا ، فهي gasPrice ، gasLimit و nonce.

  • gasPrice هو الحد الأقصى لسعر الغاز الذي ترغب في دفعه مقابل هذه الصفقة.
  • gasLimit هو الحد الأقصى للغاز الذي ترغب في دفعه مقابل هذه المعاملة.
  • نونسي التي تراها هنا لا يجب الخلط بينها وبين نونسي المستخدمة في عملية التعدين. كما اتضح ، nonce لمعاملة هو معلمة يتم استخدامها للحفاظ على الترتيب الذي تتم فيه معالجة المعاملات. لذلك إذا قمت بإرسال معاملة مع nonce والتي ليست واحدة ثم الصفقة السابقة من نفس الحساب ثم سيتم رفض تلك المعاملة.

لذلك علينا أن نحرص على إرسال قيمة nonce بشكل صحيح ، والتي بدونها تفشل المعاملة.

المعاملات الخام بين الحسابات

سوف نستخدم وحدة عقدة تسمى ethereum-js لإنشاء معاملات خام خارج وحدة التحكم geth. من خلال ما تحدثنا أعلاه ، نحتاج إلى القيمة الصحيحة لـ nonce لإرسال المعاملة ، لذلك دعنا نتعرف على nonce من عقدة geth التي سنرسل المعاملة منها ، والتي يمكن العثور عليها باستخدام

eth.getTransactionCount (<حساب>)

يجب أن نعرف أيضًا المفتاح الخاص للحساب الذي نريد إرسال المعاملة منه. أسهل طريقة للحصول على المفتاح الخاص هي باستخدام ميزة الاسترداد الخاصة بوحدة keythereum لمعرفة المفتاح الخاص من ملف geth keystore. يوجد أدناه رمز للحصول على المفتاح الخاص من keyfile

const keythereum = require ('keythereum') ؛
عنوان العنوان = '0x9e378d2365b7657ebb0f72ae402bc08812022211' ؛
const datadir = '/ home / المسؤول / ethereum / data' ؛
كلمة مرور const = 'كلمة المرور' ؛
اسمحوا شارع.
keythereum.importFromFile (العنوان ، datadir ، الوظيفة (keyObject) {
  keythereum.recover (كلمة المرور ، keyObject ، الوظيفة (privateKey) {
    console.log (privateKey.toString ( 'عرافة'))؛
// 05a20149c1c76ae9da8457435bf0224a4f81801da1d8204cb81608abe8c112ca
  })؛
})؛

يمكننا إنشاء معاملة خام من حساب إلى آخر باستخدام الكود التالي

const ethTx = require ('ethereumjs-tx') ؛

const txParams = {
  nonce: '0x6' ، // استبدال بـ nonce لحسابك على عقدة geth
  سعر الغاز: '0x09184e72a000' ،
  gasLimit: '0x30000' ،
  إلى: '0xfa3caabc8eefec2b5e2895e5afbf79379e7268a7' ،
  القيمة: "0x00"
}؛
// يتم إنشاء المعاملة
const tx = ethTx جديدة (txParams) ؛
const privKey = Buffer.from ('05a20149c1c76ae9da8457435bf0224a4f81801da1d8204cb81608abe8c112ca'، 'hex')؛
// يتم توقيع المعاملة
tx.sign (privKey)؛
const serializedTx = tx.serialize ()؛
const rawTx = '0x' + serializedTx.toString ('hex') ؛
console.log (rawTx)

سنحصل الآن على سلسلة معاملة أولية كإخراج للبرنامج. يمكن إرسال هذا إلى شبكة Ethereum باستخدام الأمر التالي في وحدة التحكم geth.

eth.sendRawTransaction ()

ستتمكن الآن من رؤية تجزئة المعاملة الخاصة بالمعاملة.

في المنشور التالي ، سنكتشف كيفية إرسال المعاملات الأولية إلى العقد.

ملحوظة:

  • استخدم هذه الطريقة أثناء العمل مع Ethereum mainnet ، فقط إذا كنت تعرف ما تفعله لأن هذا قد يكون له آثار أمنية حيث يتم استخراج مفتاحك الخاص هنا.
  • هناك طريقة أخرى لإنشاء معاملة أولية في Go in المذكورة هنا.

المراجع

  • https://github.com/ethereumjs/ethereumjs-tx
  • https://github.com/ethereumjs/keythereum#key-import
  • https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethsendrawtransaction