در این مقاله به آموزش Hyperledger Sawtooth می پردازیم. توجه داشته باشید این آموزش یک مقدمه کلی برای نحوه عملکرد پلتفرم Sawtooth است و در واقع Sawtooth را به طور عمیق مانند رمزنگاری زیرین آن و غیره را توضیح نمی دهد. در حال حاضر Sawtooth فقط در اوبونتو و AWS پشتیبانی میشود، بنابراین ما از docker استفاده میکنیم که به ما کمک میکند بدون توجه به معماری سیستم زیربنایی، Sawtooth را مستقر کنیم.
برای آشنایی با آموزش برنامه نویسی بلاک چین پکیج برنامه نویسی بلاک چین را ملاحظه نمایید.
پیش نیازها
پیش نیازهایی که مورد نیاز است عبارتند از:
پنجره ها
آخرین نسخه Docker Engine را برای ویندوز نصب کنید. در ویندوز، وقتی Docker Engine را نصب می کنید، Docker Compose به طور خودکار نصب می شود.
سیستم عامل مک
آخرین نسخه Docker Engine را برای macOS نصب کنید. در macOS، وقتی Docker Engine را نصب میکنید، Docker Compose بهطور خودکار نصب میشود.
لینوکس
در لینوکس مراحل زیر را دنبال کنید:
Docker Engine را نصب کنید.
Docker Compose را نصب کنید.
در مرحله بعد باید فایل docker composer را دانلود کنید که امکان استقرار شبکه Sawtooth را در کانتینرهای docker فراهم می کند.
حالا شروع می کنیم:
به پوشه ای که فایل docker را در آن دانلود کرده اید بروید و دستور زیر را اجرا کنید:
docker-compose -f sawtooth-default.yaml up
پس از اجرای دستور، کانتینرهای docker را خواهید دید که مقداردهی اولیه می شوند.
نکته: همچنین می توانید با تایپ کردن دستور “docker ps” کانتینرهای docker را ببینید.
از آنجایی که Sawtooth را در ظرف Docker مستقر کرده اید، برای استفاده از Sawtooth cli باید وارد کانتینر مشتری شوید. برای ورود به کانتینر کلاینت با دستور “docker exec -it sawtooth-shell-default bash” را اجرا کنید. هنگامی که در داخل هستید، می توانید به دستورات cli Sawtooth دسترسی داشته باشید.
پیشنهاد مطالعه: آموزش هایپرلجرفابریک و ساخت بلاکچین خصوصی با نصب هایپرلجر فابریک
همچنین میتوانید با اجرای «curl http://rest-api:8008/blocks» یا از دستگاه میزبان توسط «curl http://localhost:8008، اتصال را بررسی کنید تا تأیید کنید که اعتبارسنجی از داخل کانتینر داکر در حال اجرا است و قابل دسترسی است. /بلوک ها».
هنگامی که مطمئن شدید که کانتینر مشتری شما می تواند به اعتبارسنجی دسترسی داشته باشد، در مرحله بعد دو کاربر ایجاد می کنید تا دو بازیکن را برای tic-tac-toe شبیه سازی کنید. برای این کار میتوانید از دستور زیر keygen از sawtooth cli استفاده کنید، که یک فایل کلید خصوصی و یک فایل کلید عمومی تولید میکند تا کاربران بتوانند تراکنشها و دستههای Sawtooth را امضا کنند.
“Saw Tooth Keygen alex”
“Saw Tooth keygen leo”
این دستورات دو کاربر به نام های “alex” و “leo” ایجاد می کند.
برای شروع بازی Tic-Tak-Toe ما از “XO Cli” استفاده خواهیم کرد. این Cli، ساخت و ارسال تراکنشها را به اعتبارسنجی در حال اجرا از طریق URL REST API اعتبارسنجی انجام میدهد. برای بررسی اینکه آیا دستور XO کار می کند یا نه “xo -h” را در داخل کانتینر مشتری اجرا می کند.
اکنون برای شروع بازی tic-tak-toe دستور «xo create game — url http://rest-api:8008 — username alex» را اجرا کنید ( — در دستورات در واقع 2 علامت خط تیره (-) بدون فاصله وجود دارد).
اکنون از دستور «xo list — url http://rest-api:8008 — username alex» برای نمایش اطلاعات همه بازیهای XO در حالت استفاده کنید.
کاربر alex اولین حرکت را انجام خواهد داد. برای آن دستور «xo take game 5 — url http://rest-api:8008 — username alex» را اجرا کنید. با این کار موقعیت 5 در شبکه تیک تاک به عنوان “X” مشخص می شود. (فضاهای شبکه از 1 تا 9 شماره گذاری می شوند. گوشه بالا سمت چپ شماره 1 و گوشه پایین سمت راست شماره 9 است.). برای مشاهده شبکه tic-tak-toe از دستور show sub به عنوان «xo show game — url http://rest-api:8008 — username alex» استفاده کنید.
در اینجا می توانیم تمام اطلاعات مربوط به وضعیت بازی را مشاهده کنیم.
برای اینکه بازیکن 2 فضای خود را در شبکه مشخص کند، دستور take sub را مشابه player1 اجرا کنید “xo take game 6 — url http://rest-api:8008 — username leo”. هنگامی که بازیکنان تمام نوبت های خود را انجام دادند، می توانید نتیجه بازی را با دستور فرعی نمایش دوباره تایپ کنید، “xo show game — url http://rest-api:8008 — username leo” را مشاهده کنید.
به تکرار دستورات با پوزیشن های مختلف و با تناوب بین بازیکنان نیز ادامه دهید و در نهایت برنده را خواهید یافت.
حالا وقت آن رسیده کمی عمیق تر به هایپر لجر بپردازیم:
ابتدا فایل مدل را از آموزش ذکر شده در بالا با تعریف رویداد تغییر دهید.
/**
* فایل مدل جدید
*/
فضای نام org.acme.model
حساب دارایی شناسایی شده توسط accntId {
o رشته acnctId
o تعادل دو برابری
}
کاربر شرکت کننده شناسایی شده توسط userId {
o رشته userId
o رشته firstname
→ حساب کاربری
}
تراکنش SampleTransaction {
o مقدار دو برابر
→ حساب fromacnct
→ حساب toacnt
}
رویداد BasicEvent {
→ حساب toacnt
→ حساب fromacnct
o مقدار دو برابر
} // توجه: → در واقع "- ->" است، بدون فاصله.
ما اکنون یک کد زنجیرهای بلاک چین میسازیم تا یک رویداد را در هنگام مواجهه با تراکنش در شبکه راهاندازی کند … یعنی اگر انتقال پول از یک حساب به حساب دیگر اتفاق میافتد (زمانی که تراکنش “SampleTransaction” را اجرا میکند، باید رویداد را فعال کند. برای تحقق این هدف، منطق SampleTransaction خود را بهروزرسانی میکنیم، به گونهای که رویدادی را در فایل اسکریپت منتشر میکند. به روز رسانی فایل اسکریپت باید شبیه آن باشد
/**
* فایل اسکریپت جدید
*/
/**
* تابع تراکنش نمونه.
* @param {org.acme.model.SampleTransaction} انتقال نمونه
* @معامله
*/
تابع نمونه انتقال (انتقال نمونه){
sampletransfer.fromaccnt.balance -=sampletransfer.amount;
sampletransfer.toaccnt.balance +=sampletransfer.amount;
بازگشت getAssetRegistry ("org.acme.model.account")
.then(function(accountRegistery){
بازگشت حسابRegistery.updateAll([sampletransfer.fromaccnt,sampletransfer.toaccnt])
.then(function(accountRegistery){
var factory = getFactory();
var basicEvent = factory.newEvent('org.acme.model', 'BasicEvent');
basicEvent.fromaccnt=sampletransfer.fromaccnt;
basicEvent.toaccnt=sampletransfer.toaccnt;
basicEvent.amount=sampletransfer.amount;
emit(basicEvent);
})
})؛
}
در کد فایل اسکریپت بالا، ما این رویداد را زمانی که دفتر کل توسط SampleTransaction به روز می شود، راه اندازی کرده ایم. پس از انتشار رویداد در شبکه، یک برنامه Node js می تواند مشترک شود/به آن گوش دهد. این رویدادها را می توان در محیطcomposer نیز آزمایش کرد.
تست کردن درcomposer به جای تست محلی آسانتر است، بنابراین اجازه دهید ابتدا با تست آن درcomposer شروع کنیم.
برای تست در composer، پس از اعمال تغییرات بالا به ترتیب در فایل های Model و Script، ابتدا دکمه “update” را فشار دهید. حالا به تب test بروید، در آنجا گزینههای «users» و «accounts» را میبینید که در بالا ایجاد کردیم. حالا لازم است روی دکمه “Submit Transaction” کلیک کنید.
اکنون مقدار “مبلغ” را مشخص کنید که باید منتقل شود. در «fromaccnt» مقدار بعد از # را به شناسه حساب ارسالی و در «toaccnt» دوباره مقدار بعد از # را به شناسه حساب ذینفع تغییر دهید. با کلیک بر روی ارسال، به صفحه حساب هدایت می شوید و در این صفحه می توانید انتقال وجه از یک حساب به حساب دیگر را مشاهده کنید.
اکنون میتوانید با پیمایش به «همه تراکنشها» تأیید کنید که آیا رویداد انجام شده است یا خیر
در اینجا می توانید گزارش تراکنش های انجام شده در شبکه را مشاهده کنید. این گزارشها شامل مهر زمان، شرکتکننده تراکنشها خواهد بود. همچنین می توانید با کلیک روی پیوند “مشاهده رکورد” مشاهده کنید که تراکنش یک رویداد را راه اندازی کرده است یا خیر
اگر یک تراکنش رویدادها را راهاندازی کند، با کلیک روی پیوند «مشاهده رکورد» میتوان تعداد رویدادهایی را که توسط آن تراکنش راهاندازی شده است مشاهده کرد. همچنین می توانید با کلیک بر روی تب “رویدادها” و سپس کلیک بر روی رویداد مربوطه، اطلاعات مربوط به آن رویداد را مشاهده کنید.
اکنون که رویدادها را در زمین بازی composer آزمایش کردهایم، در مرحله بعد این شبکه را به صورت محلی بر روی ماشینهای خود مستقر میکنیم و یک برنامه Node js مینویسیم که در این رویداد مشترک میشود.
برای شروع ابتدا باید Fabric را دانلود کنیم. اما قبل از اجرای fabric، سیستم باید برخی از پیش نیازها را برآورده کند.
پیشنهاد مطالعه: آموزش ساخت اولین شبکه Hyperledger Fabric
اکنون برای راه اندازی سرویس “docker” به خط فرمان بروید و “service docker start” را اجرا کنید. این دستور پس از نصب سرویس های docker را راه اندازی می کند.
برای دریافت یک زمان اجرا Hyperledger Fabric محلی، برای استقرار شبکه تجاری خود، دایرکتوری به نام Fabric-tools ایجاد کنید و دستور زیر را اجرا کنید:
curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/ master/packages/fabric-dev-servers/fabric-dev-servers.zip
اکنون مستقیماً به “fabric-tools” در سیستم خود بروید، در داخل آن می توانید چندین اسکریپت bash را پیدا کنید، از جمله یکی از آنها که به هدف ما مربوط می شود “downloadFabric.sh” است، این اسکریپت تمام تصاویر docker مورد نیاز را در سیستم ما دانلود می کند.
در نهایت با اجرای اسکریپت “startFabric.sh” شبکه فابریک خود را راه اندازی کنید. پس از این می توانید مشاهده کنید، شبکه فابریک مستقر شده است، کانتینرهای docker با تایپ دستور “docker ps” مقداردهی اولیه شده اند.
حالا یک کارت مدیریت همتا بسازید، با اجرای اسکریپت “createPeerAdmin.sh” مشاهده می کنید که کارت مدیریت همتا در مسیر زیر “~/.composer/cards” ایجاد شده است.
بعدی در ردیف دانلودها “composer cli” است، می توانید از مراحل ذکر شده در اینجا استفاده کنید.
هنگامی که همه اینها با موفقیت نصب شدند، باید فایل “.bna” منطق کسب و کار را دانلود کنید.
بنابراین به پنجره composer خود بروید، روی صادرات کلیک کنید و فایل “.bna” خود را ذخیره کنید.
پس از ایجاد دایرکتوری با همان نام شبکه خود، فایل “.bna” خود را به آن منتقل کنید.
به آن دایرکتوری بروید و “npm init” را انجام دهید. با این کار یک فایل package.json در اختیار شما قرار می گیرد. برای تعامل با شبکه مستقر، ما تنها به یک ماژول npm نیاز داریم، این ماژول میتوانیم آن را با تایپ کردن «npm i composer-client — save» دانلود کنیم.
حالا داخل فایل js خود کد زیر را وارد کنید:
const BusinessNetworkConnection = نیاز ("composer-client").BusinessNetworkConnection;
this.bizNetworkConnection = new BusinessNetworkConnection();
this.cardName ='admin@testnetwork';
this.businessNetworkIdentifier = ‘testnetwork’;
this.bizNetworkConnection.connect(this.cardName)
.then((نتیجه) => {
this.bizNetworkConnection.getAssetRegistry («org.acme.model.account»)
.then((رجیستری) => {
بازگشت registry.getAll();
})
.then((aResources) => {
console.log("تعداد حساب ها: "+aResources.length);
console.log ("لیست حساب");
اجازه دهید arrayLength = aResources.length;
برای (بگذارید i = 0; i < arrayLength; i++) {
console.log(aResources[i].accntId);
}
})
.catch(function (خطا) {
خطای پرتاب
})
})
.catch(function (خطا) {
خطای پرتاب
})؛
this.bizNetworkConnection.on('event',(evt)=>{
console.log(" — — — — — -Transcation اتفاق افتاد — — — — —»);
console.log("از حساب: "+evt.fromaccnt);
console.log("To Account: "+evt.toaccnt);
console.log("مبلغ انتقال داده شده: "+evt.amount);
})؛
اکنون ما شبکه تجاری خود را در فابریک خود مستقر خواهیم کرد و عبارت “composer runtime install — card PeerAdmin@hlfv1 — businessNetworkName testnetwork” را تایپ می کنیم. توجه داشته باشید که باید “testnetwork” را با نام شبکه تجاری خود جایگزین کنید.
در مرحله بعد، شبکه کسب و کار خود را با تایپ کردن دستور “composer network start — card PeerAdmin@hlfv1 — networkAdmin admin — networkAdminEnrollSecret adminpw — archiveFile testnetwork.bna — file networkadmin راه اندازی می کنیم، مطمئن شوید که فایل “testnetwotk.bna” را جایگزین کنید. نام فایل شبکه کسب و کار خودتان
سپس با تایپ کردن “composer card import — file networkadmin” کارت مدیریت را به فایل “networkadmin” وارد می کنیم، سپس “rest-server” خود را با تایپ کردن “composer-rest-server” راه اندازی می کنیم.
با رفتن به “http://localhost:3000” می توانید api های سرور استراحت خود را مشاهده کنید. همانطور که در محیط composer انجام دادیم، کاربران و حسابهایی ایجاد کنید، اما اکنون از این apiها استفاده کنید، زیرا این apiها رسانه ما برای تعامل با شبکه تجاری مستقر هستند.
با اجرای دستور node filename.js، اکنون می توانیم لیست حساب های موجود در شبکه خود را مشاهده کنیم.
این نشان می دهد که برنامه node js ما با موفقیت با شبکه تجاری مستقر شده ما تعامل دارد و در حال حاضر به رویدادهایی که در شبکه رخ می دهد گوش می دهد. برای اینکه ببینیم برنامه ما به رویدادها گوش می دهد، یک “SampleTransaction” را از طریق بقیه api اجرا می کنیم. به محض اجرای تراکنش از طریق api، میتوانیم برنامه Node js خود را مشاهده کنیم که آن رویداد را ثبت میکند.
با این کار، ما با موفقیت به هدف خود برای استقرار شبکه تجاری خود، و اشتراک در رویدادهایی که در آن شبکه رخ می دهد، از طریق یک برنامه node js دست یافته ایم.