كيفية رمز الرمز السري الخاص بك على Ethereum

Ethereum ليست خاصة. في كل مرة تقوم فيها بنقل رمز ERC20 أو أي أصول رقمية أخرى ، يتم تسريب المعلومات إلى جهات خارجية. يمكنهم اكتشاف تاريخك المالي الكامل ببساطة عن طريق التوجه إلى Etherscan أو Blockscout أو أي مستكشف blockchain آخر هناك.

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

اسمحوا لي أن أقدم AZTEC: بروتوكول خصوصية مبني على أعلى Ethereum. في هذه المقالة ، لن أؤكد على التشفير الذي يقوم عليه البروتوكول ، بل على تطبيقاته العملية مثل تطوير الرموز السرية.

إخلاء المسئولية: أعمل في شركة AZTEC كمهندس برامج بدوام كامل.

المتطلبات الأساسية

سأفترض كذلك أن لديك فهمًا أساسيًا لما يلي:

  • تطوير Ethereum باستخدام إطار الكمأة
  • البراهين المعرفة صفر
  • تشفير ومنحنيات إهليلجية

تأكد من وجود node.js و npm على جهازك وتثبيت Truffle:

npm $ تثبيت الكمأة - العالمية

نماذج عقليه

دعونا نتوقف للحظة ونفهم المفاهيم التقنية الأساسية.

بروتوكول

Ethereum بلد و AZTEC هي غابة.

في هذا البلد ، يتفاعل الناس ، ويمولون على dApps ، وينتقلون إلى مدن مختلفة (محافظ) وما إلى ذلك. أحب أن أفكر في AZTEC كغابة هادئة محصورة في جغرافية البلد. يمكن للناس الذهاب إلى هناك ، وإعلان رصيدهم قبل الدخول ، لكن بعد هذه المعاملات تكون سرية.

تمثل صورة السهم أدناه محاولتي (السخيفة) لتصوير فكرة التلاشي في AZTEC. من الواضح تمامًا ما يحدث في البيئة الطبيعية (Ethereum) ، لكن حالة العالم بعد عبور القوس هي غامضة وتخفيها الغابات (AZTEC).

ملاحظات

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

من المهم للغاية التمييز بين ERC20 و ERC1724 - معيار الرمز السري الخاص بـ AZTEC. السابق يخزن تعيين بين عناوين Ethereum والأرصدة غير المشفرة. هذا الأخير لا تشفير الأرصدة. أحب مقارنة مذكرات AZTEC مع Bitcoin UTXOs ، حيث أن عملية إنفاق الملاحظات على AZTEC متشابهة إلى حد كبير.

محتويات المذكرة ، مصنفة حسب وضوحها:

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

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

دعنا نقوم به

استنساخ هذا الريبو وتثبيت وحدات العقدة:

git clone git@github.com: PaulRBerg / secret-tokens.git
$ الرموز السرية السرية
تثبيت $ npm

إذا حصلت على الكثير من السجلات المطوّلة المتعلقة بـ "تشفير" و "keccak" ، فهذا جيد تمامًا لأننا نحتاج إلى aztec.js الذي يتطلب web3.js والذي يحتوي لاحقًا على العديد من تبعيات التشفير.

قبل تشغيل العرض التوضيحي فعليًا ، هناك بعض الخطوات المهمة التي يجب القيام بها:

  1. قم بإنشاء ملف accounts.js داخل مجلد src. فقط تعيين حسابين. يوجد ملف مثال يسمى accounts.js.example.
  2. قم بإنشاء ملف .env في جذر المشروع واملأه بالخصائص أدناه. مرة أخرى ، يوجد ملف مثال يسمى .env.example.
  3. نشر العقد الرمز المميز السري إلى Rinkeby. يمكنك استخدام Truffle للقيام بذلك:
$ الكمأة تهاجر - شبكة رينكيبي

متغيرات البيئة:

  1. CONFIDENTIAL_TOKEN_ADDRESS: لاحظ أن اسم العقد الفعلي هو ZKERC20 ، احصل على هذا بعد نشر الكمأة العقد
  2. ذاكري
  3. INFURA_API_KEY

الآن ، تحقق من أن مشروعك يبدو كالتالي:

قم بتشغيل العرض التوضيحي:

$ npm المدى التجريبي

هذا سيستغرق بعض الوقت ، لأنه يتم إرسال المعاملات إلى Rinkeby. بعد بضع دقائق ، يجب أن يكون لديك قائمة بالإيصالات المطبوعة في وحدة التحكم. الصيحة ، لقد أجريت للتو أول عملية نقل رمزية سرية على Ethereum!

الآن ، دعنا نذهب من خلال شفرة المصدر في src / demo.js.

إنشاء ملاحظات

aztecAccounts = [... new Array (2)]. map (() => aztec.secp256k1.generateAccount ())؛
  ملاحظات = [
    aztec.note.create (aztecAccounts [0] .publicKey ، 5) ،
    aztec.note.create (aztecAccounts [0] .publicKey ، 5) ،
    aztec.note.create (aztecAccounts [1] .publicKey ، 8) ،
    aztec.note.create (aztecAccounts [0] .publicKey ، 2)
  ].

خطوات:

  1. توليد مجموعة من الحسابات العشوائية. يتعين علينا استخدام "secp256k1" لأن AZTEC يحتاج إلى المفاتيح العامة للحسابات ، وليس فقط عناوينها.
  2. قم بإنشاء 4 ملاحظات ، حيث ينتمي الأولان إلى الحساب الأول والأخيران يمنحان 8 رموز من إجمالي المبلغ الأولي (10) إلى الحساب الثاني.

لفهم الخطوة 2 بشكل أفضل ، تذكر أن ملاحظات AZTEC متشابهة في طبيعتها مع Bitcoin UTXOs. عندما يحول المرء الأموال ، يتعين تحويل المبالغ المتبقية إلى مجموعة جديدة من الملاحظات - وهذا على النقيض من المعاملات القانونية Ethereum ، التي تستخدم نموذج التوازن.

أيضًا ، قمت بفصل الحسابات المستخدمة في Ethereum (تلك الموجودة في src / accounts.js) عن حسابات AZTEC التي تم إنشاؤها عشوائيًا (يقوم البرنامج النصي التجريبي بإنشاء ملف يسمى aztecAccounts.json).

إنشاء أدلة Dem

البراهين [0] = aztec.proof.joinSplit.encodeJoinSplitTransaction ({
    المدخلاتلاحظ: [] ،
    outputNotes: notes.slice (0 ، 2) ،
    senderAddress: accounts [0] .address ،
    inputNoteOwners: [] ،
    publicOwner: accounts [0] .address ،
    kPublic: -10 ،
    aztecAddress: joinSplit.options.address ،
  })؛

كائن إثبات أعلاه:

  1. يشهد بأن publicOwner يسعده نقل 10 رموز ERC20 عامة إلى نموذج AZTEC
  2. يجعل أول حساب تم إنشاؤه عشوائيًا من AZTEC هو المالك الجديد (تذكر أن الملاحظات الأولى تبلغ قيمتها 5 رموز لكل منهما وأن كلاهما مملوكان لحساب AZTEC)
البراهين [1] = aztec.proof.joinSplit.encodeJoinSplitTransaction ({
    مدخلاتالملاحظات: notes.slice (0 ، 2) ،
    outputNotes: notes.slice (2، 4)،
    senderAddress: accounts [0] .address ،
    inputNoteOwners: [aztecAccounts [0] ، aztecAccounts [0]] ،
    publicOwner: accounts [0] .address ،
    kPublic: 0 ،
    aztecAddress: joinSplit.options.address ،
  })؛

البرهان الثاني:

  1. نقل 8 رموز إلى حساب AZTEC الثاني في شكل المعرفة الصفرية كاملة
  2. يحرق مذكرتي الإدخال الأولتين حتى لا يتمكن حساب AZTEC الأول من إعادة استخدامها في المستقبل
proofOutputs = proofs.map (({expectedOutput}) => {
    إرجاع aztec.abiEncoder.outputCoder.getProofOutput (expectedOutput، 0)؛
  })؛
  proofHashes = proofOutputs.map (proofOutput => {
    إرجاع aztec.abiEncoder.outputCoder.hashProofOutput (proofOutput) ؛
  })؛

نحن بحاجة إلى ما ورد أعلاه للتفاعل مع العقد المسمى "NoteRegistry" ، وهو فريد من نوعه لكل عقد رمزي سري. يمكنك التفكير في proofHashes كمجموعة من المعرفات الفريدة للبراهين التي تم إنشاؤها مسبقًا.

يوافق

من أجل (اسمحوا i = 0 ؛ أنا 

نحن نعتبر مجموعة من الرموز ونمنح إذن NoteRegistry للإنفاق من عقد ERC20.

كونتا دلتا = 10 ؛
  دع البيانات = noteRegistry
    .طرق
    .publicApprove (proofHashes [0] ، دلتا)
    .encodeABI ()؛
  في انتظار sendTx ({
    من: حسابات [0]. العنوان ،
    إلى: noteRegistry.options.address ،
    البيانات: البيانات ،
    privateKey: accounts [0] .privateKey ،
  })؛

تمامًا مثل ERC20 ، يجب منح NoteRegistry إذنًا للعمل مع أدلة AZTEC. نحن نعترف بأن هذا مجال من الأبحاث النشطة ونبحث في طرق لجعل تطوير UX أكثر سلاسة.

نقل

دع البيانات = confidentialToken
    .طرق
    .confidentialTransfer (البراهين [0] .proofData)
    .encodeABI ()؛
  في انتظار sendTx ({
    من: حسابات [0]. العنوان ،
    إلى: confidentialToken.options.address ،
    البيانات: البيانات ،
    privateKey: accounts [0] .privateKey ،
  })؛
  البيانات = confidentialToken
    .طرق
    .confidentialTransfer (البراهين [1] .proofData)
    .encodeABI ()؛
  في انتظار sendTx ({
    من: حسابات [0]. العنوان ،
    إلى: confidentialToken.options.address ،
    البيانات: البيانات ،
    privateKey: accounts [0] .privateKey ،
  })؛

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

إليكم خريطة ذهنية لما فعلناه للتو:

تحفظات

  • يستخدم هذا البرنامج التعليمي إعدادًا موثوقًا تم إنشاؤه بواسطة فريقنا داخليًا. سنصدر المزيد من المعلومات حول إنشاء إعداد موثوق به للإنتاج في المستقبل القريب. استخدام على مسؤوليتك الخاصة.
  • هناك الكثير من الموافقات المسبقة المطلوبة قبل إجراء التحويلات السرية. كما ذكرنا سابقًا ، هذا شيء نتطلع إلى تحسينه.
  • قد يمر codebase AZTEC خلال التغييرات كسر متعددة بعد نشر هذه المقالة. لا تخف ، هذا البرنامج التعليمي يستخدم إصدارات دقيقة من حزم npm لمنع الانقطاع.
  • يستخدم AZTEC برنامج Solidity 0.4.24 ، لذا يجب عليك استخدام إصدار متوافق من OpenZeppelin ، وهو 2.0.0
  • عندما يكون لعقود AZTEC مستخدم واحد فقط ، يتم تسريب السرية. يمكن للأطراف الثالثة استنتاج مقدار الأموال المودعة بسبب الطبيعة العامة لـ ERC20 - يمكنهم مقارنة ذلك بالمبلغ الإجمالي الذي يحتفظ به العقد. كلما انضم المستخدمون ، زادت السرية.

حزم

فيما يلي قائمة شاملة بمنتجات AZTEC التي استخدمناها:

  1. aztec.js
  2. @ ازتيك / عقد عناوين
  3. @ ازتيك / عقد التحف
  4. @ ازتيك / ديف تيلس
  5. @ ازتيك / بروتوكول

شفرة المصدر لجميعهم متوفرة في monorepo لدينا. لا تتردد في التواصل مع Twitter أو البريد الإلكتروني على hello@aztecprotocol.com إذا كان لديك أي أسئلة!

يتم إحتوائه

آمل أن تستمتع بهذا البرنامج التعليمي وأنك متحمس للمعاملات السرية كما أنا. تحقق من هذه المعاملات التي تستخدم اثنين من أدلة AZTEC لتحويل 10 رموز ERC20 إلى نموذج كامل المعرفة صفر:

  • https://rinkeby.etherscan.io/tx/0x85ab17ab8290bad0d91501083c571a63e8715a0d425828df4c0b36accb11d077
  • https://rinkeby.etherscan.io/tx/0xf5dbaf357e09abf2d4151974bdfae5e20317043b155ff653b03fbd137c940a84

شكرا جزيلا ل Zac و Arnaud S. و Tom Waite لإسهاماتهم وتعليقاتهم

ابحث عني على Twitter أو Keybase إذا كنت تريد الدردشة.