شعار زيفيرنت

كيف صممت تطبيق Fit للتجارة الإلكترونية باستخدام Lisk

التاريخ:

صورة

صورة ملف تعريف Lisk Hacker Noon

@يسكيسك

نقوم بتمكين المطورين من خلال مجموعة أدوات تطوير البرامج لتطبيقات blockchain المكتوبة بلغة JavaScript.

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

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

السياق العالمي

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

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

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

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

ما هو "فيت"؟

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

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

Fit هو مشروع للتجارة الإلكترونية لمتجر للأطعمة الصحية (FitMarket Argentina) ، ويهدف إلى توفير المزيد من الشفافية للمستهلكين فيما يتعلق بالأغذية والاستدامة والعمليات ، وقناة معلومات جديدة لمورديه باستخدام شبكة وتطبيق جوال.

بدأنا بتحديد أنواع معينة من "المهام" (التي ستتزامن بطريقة معينة مع المعاملات) ، والتي كان Fit سيديرها ، ويمكن رؤية هذه المهام مدرجة أدناه:

  1. حدد أفضل المنتجين / الموردين المحتملين بناءً على كيفية تعاملهم مع المنتج ، واحترام البيئة ، وما إلى ذلك. إذا فكرنا في هذا من وجهة نظر فنية ، فسيقومون بتسجيل المنتج. (معاملة مخصصة: تسجيل منتج)
  2. لبعض الوقت كانوا يلاحظون الطريقة التي يطور بها المنتج نشاطه ويقومون بإنشاء طوابع أو تقارير (لم يتم تصميم هذا النموذج بعد ، حيث بدأ للتو!)
  3. يرسل المنتج المنتج إلى Fit (تسجيل المنتج، حيث يتم تحميل المعلومات التي يعتبرها كلاهما مهمة).
  4. يتلقى Fit المنتج ، ويتحقق منه ، ويخزنه ، ويختمه. (إنهاء النقل وتحديث معلومات المنتج)
  5. يكتسب العميل المنتج ويرسله Fit ، (ليس في العرض التوضيحي ولكنه مشابه حقًا لمثال سلسلة التوريد).
  6. يتلقى العميل الحزمة (مسجلة ، هذا مفتوح ويعطي معلومات للسلسلة بأكملها!)
  7. يطلب العميل معلومات حول ما تم شراؤه أو حول منتج محل اهتمام.

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

فكيف يعمل؟

صورة

تنفيذ معاملات مخصصة

يتكون دليل مفهوم Fit Market من المعاملات المخصصة السبع التالية:

  •  سجل السوق
  •  تسجيل منتج
  •  تسجيل المنتج
  •  تسجيل البليت
  •  ابدأ النقل
  •  إنهاء النقل
  •  تحديث معلومات المنتج

1. تسجيل السوق

تتيح المعاملة المخصصة لسوق السجل لـ Fit Market تسجيل مركز توزيع جديد ، وإدخال اسمه وموقعه ، والذي سيتم عرضه لاحقًا على خريطة لتتبع رحلة المنتج من الحقل إلى العميل:

const market = store.account.get(this.asset.marketId); if (!market.asset.name) { const updatedMarketAccount = { ...market, ...{ asset: { name: this.asset.name, latitude: this.asset.latitude, longitude: this.asset.longitude, type: "Market" } } }; store.account.set(market.address, updatedMarketAccount);
}

2. تسجيل المنتج

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

const producer = store.account.get(this.asset.producerId); if (!producer.asset.name) { const updatedProducerAccount = { ...producer, ...{ asset: { name: this.asset.name, latitude: this.asset.latitude, longitude: this.asset.longitude, type: "Producer" } } }; store.account.set(producer.address, updatedProducerAccount); }

3. تسجيل المنتج

يسمح هذا للمنتج بتسجيل دفعة منتج جديدة. سيمكن الرمز الشريطي ومعرف الدفعة المطلوب العملاء من البحث عن معلومات المنتج عن طريق مسحها باستخدام تطبيق Fit Market.

const product = store.account.get(this.asset.productId); if (!product.asset.name) { const updatedProductAccount = { ...product, ...{ asset: { barcode: this.asset.barcode, batch: this.asset.batch, name: this.asset.name, produced_quantity: this.asset.produced_quantity, remaining_quantity: this.asset.produced_quantity, produced_date: this.asset.produced_date, due_date: this.asset.due_date, type: "Product" } } }; store.account.set(product.address, updatedProductAccount); }

4. تسجيل البليت

عادة ما يتم شحن المنتجات إلى مراكز توزيع Fit Market بكميات كبيرة. ستمكن هذه المعاملة المخصصة المنتجين من تحضير دفعة وجعلها جاهزة للشحن.

const pallet = store.account.get(this.asset.palletId); if (!pallet.asset.status) { /* * Update the sender account: * - Deduct the postage from senders' account balance */ const sender = store.account.get(this.senderId); const senderBalancePostageDeducted = new utils.BigNum(sender.balance).sub( new utils.BigNum(this.asset.postage)); const updatedSender = { ...sender, balance: senderBalancePostageDeducted.toString(), }; store.account.set(sender.address, updatedSender); /* * Update the product account: * - Deduct product_quantity from product's remaining_quantity */ const product = store.account.get(this.asset.productId); const productRemainingQuantity = product.asset.remaining_quantity - this.asset.product_quantity; product.asset.remaining_quantity = productRemainingQuantity; store.account.set(product.address, product); /* * Update the pallet account: * - Add the postage to the pallet account balance * - Add all important data about the pallet inside the asset field: * - recipient: ID of the pallet recipient * - sender: ID of the pallet sender * - carrier: ID of the pallet carrier * - security: Number of tokens the carrier needs to lock during the transport of the pallet * - postage: Number of tokens the sender needs to pay for transportation of the pallet * - status: Status of the transport (pending|ongoing|success|fail) * - product: ID of the product * - product_quantity: amount of products carried on this pallet */ const palletBalanceWithPostage = new utils.BigNum(pallet.balance).add( new utils.BigNum(this.asset.postage)); const updatedPalletAccount = { ...pallet, ...{ balance: palletBalanceWithPostage.toString(), asset: { recipient: this.asset.recipientId, sender: this.senderId, security: this.asset.security, postage: this.asset.postage, status: 'pending', carrier: null, product: this.asset.productId, product_quantity: this.asset.product_quantity } } }; store.account.set(pallet.address, updatedPalletAccount); }

5. ابدأ النقل

على غرار مثال سلسلة التوريد الخاصة بـ Lisk ، يتم إطلاق معاملة بدء النقل بواسطة شركة النقل ، والتي ستنقل المنصة النقالة من المنتج إلى Fit Market. سيتم قفل رسوم الأمان من رصيد شركة النقل أثناء استمرار الشحنة.

const pallet = store.account.get(this.asset.palletId); if (pallet.asset.status === "pending"){ const carrier = store.account.get(this.senderId); const carrierBalance = new utils.BigNum(carrier.balance); const palletSecurity = new utils.BigNum(pallet.asset.security); if (carrierBalance.gte(palletSecurity)) { /* * Update the Carrier account: * - Lock security inside the account * - Remove the security form balance */ const carrierBalanceWithoutSecurity = carrierBalance.sub(palletSecurity); const updatedCarrier = { ...carrier, ...{ balance: carrierBalanceWithoutSecurity.toString(), asset: { lockedSecurity: pallet.asset.security, } } }; store.account.set(carrier.address, updatedCarrier); /* * Update the Packet account: * - Set status to "ongoing" * - set carrier to ID of the carrier */ pallet.asset.status = "ongoing"; pallet.asset.carrier = carrier.address; store.account.set(pallet.address, pallet); }
}

6. إنهاء النقل

على غرار مثال سلسلة التوريد في Lisk ، تتيح معاملة النقل النهائية لشركة Fit Market الإعلان عن نجاح أو فشل الشحنة بعد فحص المنتج الذي تم تسليمه.


let pallet = store.account.get(this.asset.palletId);
let carrier = store.account.get(pallet.asset.carrier);
let sender = store.account.get(pallet.asset.sender);
let recipient = store.account.get(this.senderId); // if the transaction has been signed by the pallet recipient
if (recipient.address === pallet.asset.recipient) { // if the pallet status isn't "ongoing" if (pallet.asset.status !== "ongoing") { errors.push( new TransactionError( 'FinishTransport can only be triggered, if pallet status is "ongoing"', this.id, 'ongoing', this.asset.status ) ); return errors; } // if the transport was a success if ( this.asset.status === "success") { /* * Update the Carrier account: * - Unlock security * - Add postage & security to balance */ const carrierBalanceWithSecurityAndPostage = new utils.BigNum(carrier.balance).add( new utils.BigNum(pallet.asset.security)).add(new utils.BigNum(pallet.asset.postage)); carrier.balance = carrierBalanceWithSecurityAndPostage.toString(); carrier.asset.lockedSecurity = null; store.account.set(carrier.address, carrier); /* * Update the Packet account: * - Remove postage from balance * - Change status to "success" */ pallet.balance = '0'; pallet.asset.status = 'success'; store.account.set(pallet.address, pallet); return errors; } // if the transport failed /* * Update the Sender account: * - Add postage and security to balance */ const senderBalanceWithSecurityAndPostage = new utils.BigNum(sender.balance).add(new utils.BigNum(pallet.asset.security)).add(new utils.BigNum(pallet.asset.postage)); sender.balance = senderBalanceWithSecurityAndPostage.toString(); store.account.set(sender.address, sender); /* * Update the Carrier account: * - Set lockedSecurity to 0 */ carrier.asset.lockedSecurity = null; store.account.set(carrier.address, carrier); /* * Update the Packet account: * - set status to "fail" * - Remove postage from balance */ pallet.balance = '0'; pallet.asset.status = 'fail'; store.account.set(pallet.address, pallet); return errors;
}

7. تحديث معلومات المنتج

عادة لا يمتلك المنتجون المحليون الصغار المهارات أو الأدوات المطلوبة لتقديم معلومات إضافية حول منتجاتهم مباشرة إلى عملائهم. تسمح هذه الصفقة لـ Fit Market بملء الفجوات.

تساعد هذه المعلومات عملاء Fit Market في الحصول على معلومات قابلة للتنفيذ حول منتجاتهم ، خاصةً لأولئك الذين لديهم احتياجات غذائية محددة.

const product = store.account.get(this.asset.productId); if (!product.asset.fitinfo) { /* * Update the product account: * - organic: true | false | unknown * - noTACC: true | false | unknown * - transFat: true | false | unknown * - daily_units: MAX daily units according to ingredients */ product.asset.fitinfo = {}; product.asset.fitinfo.organic = this.asset.organic; product.asset.fitinfo.noTACC = this.asset.noTACC; product.asset.fitinfo.transFat = this.asset.transFat; product.asset.fitinfo.daily_units = this.asset.daily_units; product.asset.fitinfo.market = this.senderId; store.account.set(product.address, product);
}

مكونات PoC

  • النهاية الخلفية: تعمل المعاملات المخصصة التي يمكن تشغيلها على Lisk.
  • نهاية المقدمة: الحد الأدنى من واجهة ExpressJS الأمامية لتسجيل الأسواق والمنتجين والمنتجات والمنصات النقالة وبدء عمليات النقل وإنهائها وتحديث معلومات المنتج الرئيسية (التفاعل مع المعاملات).

الواجهة الأمامية

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

صورة
صورة
صورة

الموارد

GitHub جيثب:https://github.com/wozalabs/fit_market

تجريبيhttp://169.57.173.116:3000/ 

استنتاجات

تتكون استنتاجاتي من الملاحظات التالية ، واحدة تتعلق بالجانب الفني وحول Lisk على وجه الخصوص ، وملاحظة عامة حول تتبع الأغذية.

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

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

التطورات المستقبلية

لحسن الحظ ، يستمر هذا المشروع وينمو بشكل أكبر وأكبر بوجود العديد من المشاركين الراغبين في أن يكونوا جزءًا منه. علاوة على ذلك ، ستفتتح Fitmarket أول فرع لها في سويسرا في غضون أسبوعين.

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

إخلاء المسؤولية: تمت كتابة منشور المدونة هذا بواسطة عضو مجتمعنا ، سيباستيان بريولو كجزء من مشاركته في برنامج Lisk Builders. 

by يسك @يسك. نقوم بتمكين المطورين من خلال مجموعة أدوات تطوير البرامج لتطبيقات blockchain المكتوبة بلغة JavaScript.زورنا

الاوسمة (تاج)

انضم إلى Hacker Noon

قم بإنشاء حسابك المجاني لفتح تجربة القراءة المخصصة الخاصة بك.

أفلاطون. Web3 مُعاد تصوره. تضخيم ذكاء البيانات.

انقر هنا للوصول.

المصدر: https://hackernoon.com/how-i-built-the-fit-ecommerce-app-with-lisk-482l37ap؟

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة