خلاصة

في الجزء الأول ، أكملنا إعداد سلسلة Ethereum blockchain الخاصة ثنائية العقد. نقوم الآن بنشر عقد على blockchain ، ويمكن لحسابات كلا العقدتين الوصول إلى العقد وتنفيذ الوظائف.

خطتي هي نشر العقد على Node 1 ومعرفة كيفية وصول Node 2 إلى هذا العقد.

العقد الذي أستخدمه هو “Voting.sol” لماهيش مورثي في ​​مدونته (حلقة الوصل). كتب دليلًا شاملاً للغاية حول تطبيق Ethereum. أثناء قيامه بنشر التطبيق على testrpc ، أخطط لنشر نفس العقد على blockchain الخاص بي باستخدام نفس مثال النشر. يمكنك بسهولة التحقق من إجراء النشر.

نظرًا لأنه شرح بالتفصيل كيفية عمل تجميع الكود ، سأتخطى التفاصيل وأشير فقط إلى بعض النقاط ذات الصلة بنشر عقدي. يرجى الرجوع إلى الجزء 1 (حلقة الوصل) على التفاصيل حول الكود والتجميع.

قانون “Voting.sol”

Voting.sol (المصدر: حلقة الوصل)

صلابة براغما ^ 0.4.11 ؛

// علينا تحديد إصدار المترجم الذي سيجمع هذا الكود معه

تصويت العقد {

/ * حقل التعيين أدناه مكافئ لمصفوفة ترابطية أو تجزئة.

مفتاح التعيين هو اسم المرشح المخزن كنوع بايت 32 والقيمة هي

عدد صحيح بدون إشارة لتخزين عدد الأصوات

* /

رسم الخرائط (بايت 32 => uint8) التصويت العام

/ * لا تسمح لك Solidity بالمرور في مصفوفة من السلاسل في المُنشئ (حتى الآن).

سنستخدم مصفوفة بايت 32 بدلاً من ذلك لتخزين قائمة المرشحين

* /

bytes32 [] public filterList؛

/ * هذا هو المُنشئ الذي سيتم استدعاؤه مرة واحدة عندما تقوم بذلك

نشر العقد على blockchain. عندما ننشر العقد,

سنجتاز مجموعة من المرشحين الذين سيتنافسون في الانتخابات

* /

وظيفة التصويت (بايت 32 [] أسماء المرشحين) {

مرشح قائمة = أسماء المرشحين ؛

}

// تعرض هذه الوظيفة إجمالي الأصوات التي حصل عليها المرشح حتى الآن

دالة totalVotesFor (بايت 32 مرشح) بإرجاع (uint8) {

إذا (validCandidate (مرشح) == خطأ) رمي ؛

إعادة التصويت حصل [مرشح] ؛

}

// تزيد هذه الوظيفة من عدد الأصوات للمرشح المحدد. هذه

// يعادل الإدلاء بصوت

وظيفة voiceForCandidate (مرشح بايت 32) {

إذا (validCandidate (مرشح) == خطأ) رمي ؛

تم استلام الأصوات [مرشح] + = 1 ؛

}

دالة validCandidate (بايت 32 مرشح) ترجع (منطقي) {

لـ (uint i = 0 ؛ i < قائمة المرشحين. أنا ++) {

إذا (قائمة المرشحين [i] == مرشح) {

العودة صحيح

}

}

عودة كاذبة؛

}

}

د!’

هذا عقد بسيط لتوضيح كيفية عمل كود Solidity. فيما يلي بعض النقاط التي سنشير إليها في هذا الجزء.

  1. يتطلب العقد قائمة المرشحين (انظر المنشئ). سنقوم بإدخال هذا عند نشر عقد جديد.
  2. يتم تحديد وظيفتين في هذا العقد: مجموع التصويت لصالح والتصويت للمرشح. سنستخدم هاتين الوظيفتين للتفاعل مع العقد من كلا العقدتين.

يمكنك العثور على تفاصيل عملية التجميع (باستخدام solc) هنا. بعد التجميع ، نحتاج إلى جزأين من المعلومات لنشر العقد. هم واجهة التطبيق الثنائية (ABI) و Bytecode.

واجهة التطبيق الثنائية (ABI)

يحتوي على الطرق المتاحة في هذا العقد والتي يمكن للمستخدمين التفاعل معها. هنا هو ABI لعقد التصويت هذا.

‘[{"ثابت":خاطئة,"المدخلات": [{"اسم":"مرشح","اكتب":"بايت 32"}],"اسم":"totalVotesFor","النواتج": [{"اسم":"","اكتب":"uint8"}],"مستحق الدفع":خاطئة,"اكتب":"وظيفة"} ، {"ثابت":خاطئة,"المدخلات": [{"اسم":"مرشح","اكتب":"بايت 32"}],"اسم":"صالح المرشح","النواتج": [{"اسم":"","اكتب":"منطقي"}],"مستحق الدفع":خاطئة,"اكتب":"وظيفة"} ، {"ثابت":صحيح,"المدخلات": [{"اسم":"","اكتب":"بايت 32"}],"اسم":"الأصوات","النواتج": [{"اسم":"","اكتب":"uint8"}],"مستحق الدفع":خاطئة,"اكتب":"وظيفة"} ، {"ثابت":صحيح,"المدخلات": [{"اسم":"","اكتب":"uint256"}],"اسم":"قائمة المرشحين","النواتج": [{"اسم":"","اكتب":"بايت 32"}],"مستحق الدفع":خاطئة,"اكتب":"وظيفة"} ، {"ثابت":خاطئة,"المدخلات": [{"اسم":"مرشح","اكتب":"بايت 32"}],"اسم":"التصويت للمرشح","النواتج": [],"مستحق الدفع":خاطئة,"اكتب":"وظيفة"} ، {"المدخلات": [{"اسم":"أسماء المرشحين","اكتب":"بايت 32 []"}],"مستحق الدفع":خاطئة,"اكتب":"البناء"}] ‘

بايت كود

هو رمز العقد الفعلي الذي سيتم نشره على blockchain. هنا هو رمز بايت.

“0x6060604052341561000c57fe5b6040516103d83803806103d8833981016040528080518201919050505b806001908051906020019061003f929190610047565b505b506100bf565b828054828255906000526020600020908101928215610089579160200282015b82811115610088578251829060001916905591602001919060010190610067565b5b509050610096919061009a565b5090565b6100bc91905b808211156100b85760008160009055506001016100a0565b5090565b90565b61030a806100ce6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f265cf714610067578063392e6678146100a55780637021939f146100e1578063b13c744b1461011f578063cc9ab2671461015b575bfe5b341561006f57fe5b61008960048080356000191690602001909190505061017f565b604051808260ff1660ff16815260200191505060405180910390f35b34156100ad57fe5b6100c76004808035600019169060200190919050506101cd565b604051808215151515815260200191505060405180910390f35b34156100e957fe5b610103600480803560001916906020019091905050610233565b604051808260ff1660ff16815260200191505060405180910390f35b341561012 757fe5b61013d6004808035906020019091905050610253565b60405180826000191660001916815260200191505060405180910390f35b341561016357fe5b61017d600480803560001916906020019091905050610278565b005b60006000151561018e836101cd565b1515141561019c5760006000fd5b60006000836000191660001916815260200190815260200160002060009054906101000a900460ff1690505b919050565b60006000600090505b6001805490508110156102285782600019166001828154811015156101f757fe5b906000526020600020900160005b505460001916141561021a576001915061022d565b5b80806001019150506101d6565b600091505b50919050565b60006020528060005260406000206000915054906101000a900460ff1681565b60018181548110151561026257fe5b906000526020600020900160005b915090505481565b60001515610285826101cd565b151514156102935760006000fd5b600160006000836000191660001916815260200190815260200160002060008282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055505b505600a165627a7a72305820994b2ebbfeec46890216bc547cf9a1292547cc43f08440506866c34b2ff0ac9e0029 “

خطوات

الخطوة 1: قم بتثبيت node.js و web3 على كلا العقدتين

يتم التفاعل للتعاقد من خلال nodejs و web3js. نحتاج إلى تثبيت وحدات nodejs و web3. أتبع الإجراء المقترح هنا (حلقة الوصل).

العقدة 1

sudo apt-get install python-software-properties

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash –

sudo apt-get install nodejs

للتحقق من التثبيت الناجح ، استخدم $ node -v و $ npm -v ، وسيتم عرض الإصدار الخاص بهم.

ثم قم بتثبيت وحدة الويب 3.

العقدة 1

$ npm تثبيت web3

كرر هذه الخطوة في العقدة 2 أيضًا.

الخطوة 2: الوصول إلى Blockchain من خلال web3 في Node Console

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

لبدء geth ، اعتمادًا على ما إذا كنت لا تزال قيد التشغيل ، يجب أن يعيدك الأمران إلى وحدة التحكم.

العقدة 1 (geth)

geth – اكتشاف وحدة التحكم 2>>eth.log أو

ارفق geth $

لبدء تشغيل وحدة تحكم العقدة ، ما عليك سوى استخدام هذا

العقدة 1 (عقدة)

عقدة $

إعداد ثنائي العقد لإيثريوم خاص على AWS مع نشر العقد (الجزء 2)

نحن الآن جاهزون لاستخدام وحدة تحكم العقدة للوصول إلى geth بواسطة rpc. RPC الافتراضي موجود على http: // localhost: 8545 /.

أولاً ، قم بتشغيل rpc على geth:

العقدة 1 (geth)

> admin.startRPC ()

على وحدة تحكم العقدة,

العقدة 1 (geth)

> admin.startRPC ()

للتحقق مما إذا كانت العقدة يمكنها الوصول إلى geth بنجاح يمكننا استخدامها > web3.eth.accounts على وحدة تحكم العقدة. يجب أن نرى الحساب الذي أنشأناه على وحدة تحكم geth.

إعداد ثنائي العقد لإيثريوم خاص على AWS مع نشر العقد (الجزء 2)

كرر هذه الخطوة على العقدة 2.

الخطوة 3: نشر العقد على العقدة 1

نقوم الآن بنشر العقد على blockchain الخاص هذا من Node 1.

العقدة 1 (عقدة)

> أبي = <أبي المبين أعلاه>

> VotingContract = web3.eth.contract (JSON.parse (abi))

> بايت كود = <الرمز الثانوي المبين أعلاه>

نظرًا لأن النشر يتطلب الغاز ، فإننا بحاجة إلى فتح الحساب وتشغيل التعدين

العقدة 1 (geth)

> Personal.unlockAccount (eth.accounts [0])

> عامل منجم. بداية ()

الآن نقوم بنشر العقد. يتطلب هذا العقد قائمة المرشحين. سنقوم بتضمين هذا عند نشر العقد.

العقدة 1 (عقدة)

> publishContract = VotingContract.new ([‘Rama’، ‘Nick’، ‘Jose’]، {data: byteCode، from: web3.eth.accounts [0]، gas: 4700000})

الآن تم نشر العقد. ويمكننا تنفيذ وظائف التحقق. سنرى زيادة التصويت عندما نواصل تنفيذ الوظائف.

العقدة 1 (عقدة)

> تمّ نشرContract.totalVoteFor.call (“راما”)

> publishContract.voteForCandidate (‘Rama’، {from: web3.eth.accounts [0]})

إعداد ثنائي العقد لإيثريوم خاص على AWS مع نشر العقد (الجزء 2)

تم نشر العقد بنجاح. ننتقل الآن إلى Node 2 ونرى كيف يمكن للحساب في Node 2 أيضًا الوصول إلى هذا العقد.

الخطوة 4: الوصول إلى العقد من العقدة 2

تأكد من أن العقدة 1 والعقدة 2 قد أطلقا بالفعل. التحقق من قبل > admin.peers على وحدة تحكم geth على كلا العقدتين. الرجوع إلى الجزء 1 كيفية القيام به إذا لزم الأمر.

المعلومات المطلوبة لحساب في العقدة 2 تصل إلى هذا العقد المنشور هي (1) ABI و (2) عنوانها المنشور. لدينا معلومات ABI بالفعل. الآن من العقدة 1 يمكننا الحصول على هذا العنوان المنشور.

العقدة 1 (عقدة)

> نشرتContract.address

“0x97a4b975c8fde24d8e40551054342c95676ed959”

0]})

بالنسبة إلى ABI ، نحدد VotingContract بنفس abi في Node 2.

العقدة 2 (عقدة)

> أبي = <أبي المبين أعلاه>

> VotingContract = web3.eth.contract (JSON.parse (abi))

لا نحتاج إلى نشر عقد جديد كما فعلنا في العقدة 1. بدلاً من ذلك ، نحدد مثيل العقد بناءً على VotingContract والعنوان الذي حصلنا عليه من Node 1.

العقدة 2 (عقدة)

> ContractInstance = VotingContract.at (‘0x97a4b975c8fde24d8e40551054342c95676ed959’)

الجانب الأيسر هو العقدة 1 ، والجانب الأيمن هو العقدة 2.

إعداد ثنائي العقد لإيثريوم خاص على AWS مع نشر العقد (الجزء 2)

الآن ، مثيل العقد هو النقطة التي يمكننا من خلالها الوصول إلى هذا العقد المنشور في العقدة 2. يمكننا إصدار الأوامر تمامًا كما نفعل في العقدة 1:

العقدة 2 (عقدة)

> ContractInstance.totalVoteFor.call (“راما”)

> ContractInstance.voteForCandidate (‘Rama’، {from: web3.eth.accounts [0]})

)

لا تنس فتح الحساب على Node 2 عند التصويت ، لأن هذا يستهلك الغاز لتنفيذ وظيفة في العقد.

الخطوة 5: التحقق

من خلال التفاعل على كلا العقدتين ، نرى أن الحسابات على كلا العقدتين تعمل وفقًا لنفس العقد. هنا ألتقط التفاعل بين العقدتين.

  1. ترى كلا العقدتين نفس النتيجة (عدد الأصوات لراما هو 4).
  2. حساب على Node 1 يصوت لراما مرة واحدة.
  3. من العقدة 2 ، نرى أن عدد الأصوات لـ Rama أصبح الآن 5.
  4. حساب على Node 2 يصوت لراما مرة أخرى.
  5. من العقدة 1 الآن نرى أن عدد الأصوات الآن 6.

إغلاق

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

مرة أخرى ، نشكرك على العديد من الأعمال التي قام بها الآخرون والتي تلهم وتوجه إعدادي العام. ها هم,

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me