Skip to content

Norito

Norito არის Iroha-ის კანონიკური სერიალიზაციის ფენა. ეს არის ბაიტების ფორმატი, რომელიც გამოიყენება მაშინ, როდესაც თანატოლებს, SDKs, CLI ინსტრუმენტებს, Torii, Kura და გენერირებულ არტეფაქტებს უნდა შეთანხმდნენ ზუსტად იმავე სასარგებლო ტვირთზე.

გამოიყენეთ Norito, როდესაც მონაცემები შედის კონსენსუსის, ხელმოწერის, ჰეშინგის, მდგრადობის ან SDK-ს ჯვარედინული ინტერპერაბილურობის ნაწილში. გამოიყენეთ JSON, როდესაც საბოლოო წერტილი პირდაპირ გვთავაზობს ადამიანის მიერ წაკითხილ პროექციას ოპერატორებისთვის, დაშბორტებისთვის ან სწრაფი დებეგირებისათვის.

სადაც Norito გამოჩნდება

ზედაპირიროგორ გამოიყენება Norito
ტრანზაქციები და კითხვებიTorii -ის მეშვეობით წარდგენილი ხელმოწერილი ტრანზაქციები და შეკითხვები კოდირებულია როგორც Norito.
თაყუანისცემაkagami genesis sign წარმოქმნის ხელმოწერილი .nrt ბლოკი, რომელიც პარტნიორებს დატვირთვა startup.
Torii ტიპირებული პასუხებისაბოლოო წერტილები, რომლებიც მხარს უჭერენ ტიპირებულ ორმაგი პასუხებს, იყენებენ Accept: application/x-norito.
SDKsRust, Python, JavaScript, Kotlin/ჯავა, Swift, და Android კლიენტები იყენებენ Norito ხელოვნურად შედგენილი ბაიტების ნაცვლად კონსტრუქციები ან კავშირები.
Kura შენახვაბლოკის სასარგებლო ტვირთები, აღდგენითი გვერდითი მანქანები, რესტრები და commit markers ინახება როგორც Norito ჩარჩოს მონაცემები.
მანიფესტებიNexus, მონაცემების ხელმისაწვდომობა, SoraFS, სტრიმინგი და აპლიკაციის მიმართული მანიფესტები გამოიყენება Norito როდესაც მანიფესი უნდა იყოს ხელმოწერილი ან ჰაშირებული.
დინამიურიNorito სტრიმინგში გამოყენებულია Norito მანიფესტები, სეგმენტების სათაურები, მართვის ჩარჩოები და შესაბამისობის მოწყობილობები.

Norito არ არის ჭკვიანი ხელშეკრულების ენა. ეს არის დეტერმინისტური კონვერტი და კოდექი, რომელიც ატარებს ტრანზაქციებს, ხელშეკარგულებების მოწოდებებს, მანიფესტებსა და API ტიპირებულ სასარგებლო ტვირთებს.

სასარგებლო ტვირთის მოდელი

თითოეული მიბმული ან დისკზე Norito სასარგებლო ტვირთის ჩარჩოში არის სათაური, რომელსაც მოჰყვება კოდირებული სასარგებლო დატვირთების ბაიტები. სათაურის გარეშე ან შიშველი სასარგებლო ატვირთები განკუთვნილია შიდა ჰეშინგისთვის, სტანდარტებისათვის და დამხმარე APIs, რომელიც შედეგს ტრანსპორტირებამდე დაუყოვნებლივ შეავსებს სათაურში.

სათაურისზომამიზანი
მაგია.4 ბაიტიASCII NRT0, გამოიყენება არამხოლოდ Norito მონაცემების ადრეული უარყოფისათვის.
მაჟორიტარი1 ბაიტიფორმატირებული ძირითადი ვერსია. მიმდინარე სასარგებლო ტვირთების გამოყენება 0.
უმცროსი1 ბაიტიდეკოდირებული მითითება v1. მიმდინარე მნიშვნელობა არის 0x00. დროშები აღწერენ განლაგებას.
სქემა16 ბაიტიტიპის იდენტობა, რომელიც გამოიყენება ტიპირებული დეკოდერების მიერ მოულოდნელი სასარგებლო ტვირთების უარყოფისათვის.
კომპრესი1 ბაიტი0 = None, 1 = Zstd. უცნობი მნიშვნელობები უარყოფითია.
სასარგებლო ტვირთის სიგრძე8 ბაიტიარაკომპრესირებული სასარგებლო ტვირთის ხანგრძლივობა, როგორც მცირე ენდიანი u64.
CRC648 ბაიტიCRC64-XZ შეუმცირებელი სასარგებლო ტვირთის შემოწმების თანხა.
დროშები1 ბაიტიგანლაგების დროშები კომპაქტური სიგრძეებისთვის, შეფუთული თანმიმდევრობებისთვის და შეფუთულ სტრუქტებზე.

სათაური არის 40 ბაიტი. დეკოდერები ადასტურებენ ჯადოსნურობას, ვერსიას, მხარდაჭერილი დროშის ნიღაბს, სასარგებლო ტვირთის სიგრძეს, შემოწმების რაოდენობას და სქემა ჰეშს, სანამ რეკონსტრუქციაში ჩაწერილ ღირებულებას.

განლაგების დროშები

Norito ინახავს განლაგების არჩევანს საბოლოო სათაურის ბაიტში. შერჩეული v1-ის დამხმარეები გამოყოფენ COMPACT_LEN (0x02) კომპაქტური ღირებულების სიგრძის პრეფიქსებისთვის. მუდმივი სიღრმის ფსიქიკური სიგრძის წინამდებარეები კვლავ კითხვად რჩება, როდესაც მოუწოდებლები კოდირებენ flags = 0x00.

დროშაჰექსისტატუსიეფექტი
PACKED_SEQ0x01მხარდაჭერაკოდირება ცვლადი ზომის კოლექციები ოფსეტის ცხრილთან და თანმიმდევარი მონაცემთა ბლოკთან ერთად.
COMPACT_LEN0x02დეფოლტიგამოიყენება კანონიკური ხელმოუწერელი varints დიაპაზონის სიგრძის პრეფიქსებისათვის.
PACKED_STRUCT0x04მხარდაჭერაკოდები გამომდინარე-გენერირებული structs როგორც შეფუთული ველის სასარგებლო ტვირთები.
VARINT_OFFSETS0x08რეზერვებულიგამორიცხულია v1; შეფუთული სიხშირის კომპენსაციები არის ფიქსირებული სიგანის u64.
COMPACT_SEQ_LEN0x10რეზერვებულიV1- ში უარყოფილია; უმაღლესი დონის რიგის სიგრძის სათაურები არის ფიქსირებული სიგანე u64.
FIELD_BITSET0x20მხარდაჭერა მოთხოვნებითდაამატებს ბიტსეტს შეფუთული სტრუქტებისთვის, ასე რომ მხოლოდ ველები, რომლებიც საჭიროებენ მკაფიო ზომებს ატარებენ ზომის პრეფიქსებს. მოითხოვს PACKED_STRUCT და COMPACT_LEN.

დროშები არის მკაფიო. დეკოდერები არ განსაზღვრავს განლაგებას სასარგებლო ტვირთის ფორმით, უმნიშვნელო ვერსიით ან ჰეურისტებით. უცნობი ან უვნებელი კომბინაციების უარყოფა ხდება, რათა ყველა თანატოლმა ინტერპრეტაცია გააკეთოს სასარგებლო დატვირთვა ერთნაირად .

კოდირების წესები

Norito იყენებს დეტერმინისტურ განლაგებებს მონაცემთა საერთო ფორმებისათვის, რომლებიც გამოჩნდება Iroha მონაცემთა მოდელში:

  • მავთულხლართები არის [len][utf8-bytes]; len მოყვება COMPACT_LEN, როდესაც ჩართულია.
  • როდესაც COMPACT_LEN არის განსაზღვრული, თითოეული მნიშვნელობის სიგრძე კომპაქტური ვარინტის გამოყენებით ხდება.
  • როდესაც COMPACT_LEN არ არსებობს, თითოეული ღირებულების სიგრძე არის 8-ბაიტიანი პატარა ენდიანული u64.
  • რიგითი სიგრძის სათაურები ფიქსირდება 8-ბაიტიანი მცირე ენდიან u64 v1.
  • Vec<u8> კოდირებულია როგორც [len_u64][raw-bytes] ერთ სიგრძის ნაცვლად ბაიტზე.
  • შეფუთული თანმიმდევრობები იყენებენ (len + 1) მონოტონური u64 კომპენსაციებს, რასაც მოჰყვება კონკატენირებული ელემენტის სასარგებლო ტვირთები.
  • რუკაში ჩანაწერების დათვლის კოდირება ფიქსირებულია u64 და გამოიყენება დეტერმინისტური საკვანძო რეჟიმი. HashMap ჩანაწერები განლაგებულია კოდირებამდე გასაღების მიხედვით; BTreeMap იყენებს მის ბუნებრივ რეჟიმს.
  • BigInt იყენებს მცირე ზომის ორმაგი დანამატის ბაიტებს, რომელთა სიგრძე u32 არის ბაიტი და 512-ბიტიანი საზღვერი.
  • Numeric კოდირებულია როგორც (mantissa, scale), სადაც mantissa ინახავს მთელი რიცხვის მნიშვნელობას და მასშტაბი ინახავს ფრაქციონალური ციფრების რაოდენობას.

ეს წესები მნიშვნელოვანია ხელმოწერებისა და ჰეშებისათვის. ორი SDKs რომელიც ქმნის ერთსა და იმავე ლოგიკურ ტრანზაქციას, უნდა წარმოადგინოს იგივე კანონიკური ბიტები.

სქემის ჰაშები

ტიპირებული Norito სასარგებლო დატვირთვები ატარებენ 16-ბაიტიან სქემას ჰეშს სათაურში. დეფოლტური ჰეში არის მიღებული სრულად კვალიფიციური ტიპის სახელისგან. ნაგებობები, რომლებიც ხელს უწყობენ სტრუქტურული სქემის ჰეშინგს, იღებენ ჰეშს კანონიკური სქემიდან.

ტიპირებული დეკოდერები უარყოფენ სქემის შეუსაბამობას. ეს იცავს კლიენტებს, რომ არასწორი Norito ჩარჩოს შეცდომით დეკოდირება არ მოხდეს და არის ჩვეულებრივი უკმარისობის რეჟიმი, როდესაც SDK მოწყობილობის ბუნდი დრიფტობს კვანძების მონაცემთა მოდელისგან.

შეკუმშვა და დაჩქარება

Norito მხარს უჭერს მკაფიო და ადაპტიური შეკუმშვას, ლოგიკური სასარგებლო ტვირთის შეცვლის გარეშე:

მახასიათებელიმიზანი
to_bytesკოდირებული სათაური, რომელსაც მოჰყვება არასაკომპრესირებული სასარგებლო ტვირთი.
to_compressed_bytesკოდირება Zstd და ჩანაწერი compression tag in the header.
to_bytes_autoგამოიყენეთ დეტერმინისტური ჰეურისტიკა, რათა გადაწყვიტოთ ღირს თუ არა კომპრესია.
CRC64 დაჩქარებაგამოიყენება პორტატული CRC64-XZ ყველგან, CLMUL on x86_64 ან PMULL on aarch64, როდესაც ხელმისაწვდომია
GPU CRC64 და შეკუმშვანებაყოფლობითი მეტალის ან CUDA დამხმარე შეიძლება დააჩქაროს დიდი სასარგებლო ტვირთები, შემდეგ კი დაეცემა უკან CPU გზებზე.

აპარატურის დაჩქარება არასოდეს იცვლის დეკოდირებულ შინაარსს. CRC და JSON აჩქარებლები უნდა შეესაბამებოდეს პორტაბულ გამომავალი ბიტ-ბიტს. Zstd ჩარჩოს ბაიტები შეიძლება განსხვავდებოდეს CPU და GPU კოდირებს შორის, მაგრამ დეკოდებული სასარგებლო ტვირთისა და Norito სათაურის მეტადატანი რჩება დეტერმინისტური მოწმობისთვის.

JSON მხარდაჭერა

Norito მოიცავს მშობლიურ JSON დასასრული წერტილების და საჭირო ინსტრუმენტების საფარი JSON დატოვების გარეშე Norito ტიპის სისტემა.

JSON თვისებაგამოყენების შემთხვევა
norito::json::{to_json, from_json}დეტერმინისტური ტიპირებული JSON კოდი / დეკოდი.
ლამაზი და მწერლის დამხმარეCLI გამონადენი, მოწყობილობები და სტრიმინგი std::io ინტეგრაცია.
DOM ღირებულებებიპროგრამული მანიპულაცია Norito -ის JSON ღირებულების მოდელის საშუალებით.
სწრაფი დაწერილი JSONსტრუქტურული ზოლის საფუძველზე დეკოდირება/კოდირება ცხელი DTO გზებისათვის.
ნულოვანი ასლის მკითხველიტოქნის სკანირება, რომელიც სესხებს სტრიკებს შესასვლელიდან, სადაც შესაძლებელია.
სტადიის პირველი აჩქარებლებისტრუქტურული ინდექსირება AVX2, NEON, მეტალური ან CUDA სკალარული დაცემით.

Iroha კოდი უნდა უპირატესობდეს norito::json დამხმარეებს ტიპირებული API სასარგებლო ტვირთებისათვის. წარმოების გზებზე უბრალო serde_json დამატება რისკისგან განსხვავდება სქემისა და ველური მოქმედებების ქცევადან, რომელიც მოსალოდნელია SDKs და Torii ექსტრაქტორების მიერ .

გამომდინარე მხარდაჭერა

Rust მონაცემთა ტიპები, როგორც წესი, იყენებენ დერივულ მაკროებს და არა სახელმძღვანელო კოდეკის კოდს. დერივული ფენა შეიძლება წარმოქმნას Norito ორმაგი კოდეკები, სქემები და JSON დამხმარეები.

საერთო ველის ატრიბუტებია:

ატრიბუტიეფექტი
#[norito(rename = "other")]გამოიყენება სტაბილური სერიალიზებული სახელი სქემა და JSON თავსებადობისთვის.
#[norito(skip)]კოდერი გამორიცხავს ველს. დეკოდერი მიაწოდებს მის Default მნიშვნელობას.
#[norito(default)]გამოიყენება Default, როდესაც დეკოდირებული სასარგებლო ტვირთი არ ატარებს მინდორს
#[norito(skip_serializing_if = "...")]გამორიცხავს ველებს JSON როდესაც predicate შეესაბამება, ხოლო შენარჩუნების დეტერმინისტური დეკოდირების დეფოლტები.

დერივები ასევე გამოყოფენ კოდირებული სიგრძის მინიშნებებს და ზუსტი სიგრძის გამოთვლას, სადაც ეს შესაძლებელია. კოდერები იყენებენ ამ მინიშნებებს ბუფერების შესანახად და დამატებითი ასლების თავიდან ასაცილებლად.

კოლოფის მახასიათებელი ოჯახები

წყაროდან Iroha ან SDK კავშირების შექმნისას, Norito მახასიათებლები ირჩევს, რომელი დამხმარე და აჩქარებელი მოწყობილობაა ხელმისაწვდომი:

ფუნქციების ოჯახირა საშუალებას აძლევს
deriveრეექსპორტირებული პროცედურული მაკროები ბინარული, სქემა და JSON წარმოშობისთვის.
compressionZstd მხარდაჭერა სათაურის ჩარჩოების სასარგებლო ტვირთებისთვის.
packed-seqშეფუთული კოლექციის განლაგებები გამოყენებით offset ცხრილები.
packed-structშეფუთული წარმოშობით წარმოქმნილი სტრუქტურის განლაგებები.
compact-lenვარინტის სიგრძის პრეფექციები.
columnarNorito სვეტის ბლოკები, ადაპტიური რიგის კოდეკები AoS/NCB და შანერის მძიმე გზებისთვის გატანილი ნახვები; შედის ჩვეულებრივ node-codec თვისებების ნაკრებში.
strict-safeკონვერტირება დეკოდი პანიკა შეცდომაში გზების სტრუქტურირებული შეცდომები.
simd-accelCPU დაჩქარება, სადაც შესაძლებელია, დეტერმინისტური გადაცემით.
jsonმშობლიური JSON პარსერი, მწერალი, DOM, ტიპირებული დერეფანები და სწრაფი გზები.
json-std-ioმკითხველისა და მწერლის დამხმარეები ფენაზე JSON stack.
metal-stage1, cuda-stage1ფულადი GPU JSON სტრუქტურული ინდექსის სათაურები.
metal-stage2JSON სტრუქტურული მაისურის მეტა მონაცემების კლასიფიკაცია.
metal-crc64, cuda-crc64ფულადი GPU CRC64 დამხმარეები დიდი სასარგებლო ტვირთებისთვის.
gpu-compressionვარიანტი მეტალის ან CUDA Zstd დაჩქარება დიდი სასარგებლო ტვირთებისათვის.
stage1-validateDebug-validiation, რომელიც შედარებს დაჩქარებული JSON სტრუქტურული ინდექსები სკალარული output.

მახასიათებლების ხელმისაწვდომობა შეიძლება განსხვავდებოდეს SDKs და გათავისუფლების პროფილის შორის. ფირმის ფორმატი კვლავ განისაზღვრება სათაურითა და სქემით, და არა ადგილობრივი მშენებლობის დროშებით.

Torii და Norito RPC

Torii გამოყოფს JSON მრავალი ოპერატორის მარშრუტისათვის, მაგრამ ტიპირებული ორმაგი მარშრუტები იყენებენ Norito. მიმდინარე ტიპის Norito HTTP სხეულებისათვის მედია ტიპი არის application/x-norito.

გამოიყენეთ ეს სათაურები, როდესაც საბოლოო წერტილი იღებს ან იბრუნებს Norito ტიპით:

http
Content-Type: application/x-norito
Accept: application/x-norito

როდესაც საბოლოო წერტილი მხარს უჭერს ორივე წარმოდგენას, კლიენტებს შეუძლიათ გამოაგზავნონ მკაფიო პრეფერენციების სია:

http
Accept: application/x-norito, application/json

დეკოდირების ჩავარდნა გამოჩნდება როგორც Torii ტიპირებული შეცდომები და ითვლება ტელემეტრიით. გავრცელებულ მიზეზებს შორის არიან არასწორი ჯადოსნობა, დაუჭერელი ვერსია, მხარს არ უჭერს მახასიათებლების დროშა, შეამოწმებელი რაოდენობის შეუსაბამობა, არასწორად ჩამოყალიბებული UTF-8, არასწორი enum tag და სქემის შეუსაბამო.

Norito RPC ტრანსპორტი შეირჩევა ტრანსპორტის კონფიგურაციის საშუალებით. ოპერატორის დაშბორდებმა უნდა აკონტროლონ მოთხოვნის დაგვიანება, ჩავარდნები, აქტიური კავშირები, პასუხის ბიტები და torii_norito_decode_failures_total ცალკე JSON ტრაფიკიდან.

Norito გადაცემა

Norito დეტერმინისტური მიდგომა ვრცელდება მედიასაშუალებებზე და რეალურ დროში ტრანსპორტის ზედაპირებზე. მისი ძირითადი ნაწილებია:

სტრიმინგის ფუნქციამიზანი
მანიფესტებიგამოაცხადეთ სეგმენტის ვალდებულებები, კონფიდენციალურობის მარშრუტები, შესაძლებლობები, კოდეკის პროფილი, დაშიფვრის ნაკრები და შინაარსის საკვანძო მეტა მონაცემები.
სეგმენტების სათაურებიბინდ სეგმენტის ნომერი, ხანგრძლივობა, ნაწილის რაოდენობა, დრო, ენტროპიის რეჟიმი, აუდიო შემაჯამებელი და Merkle ფესვები. .
ნაწილის ვალდებულებებინება მიეცით მაყურებელს და რელეებს შეამოწმონ სასარგებლო ტვირთის ნაწილები მანიფესთან, სანამ სერვისს ან დეკოდირებას გააკეთებენ.
მართვის ჩარჩოებიატარეთ ღია განცხადებები, უკუკავშირი, ძირითადი განახლებები და შესაძლებლობების მოლაპარაკება.
HPKE ძირითადი განახლებებიროტე საიდუმლოებები ტრანსპორტის გამოყენებით მოლაპარაკებული suite და მონოტონიურად მზარდი counter.
შესაძლებლობების შესახებ მოლაპარაკებებიხსნის მხარდაჭერილი მახასიათებლების ბიტები, მონაცემთა გრამა ლიმიტები, უკუკავშირის კადენცია და კონფიდენციალურობის მოთხოვნები.
FEC და უკუკავშირიგამოიყენება დეტერმინისტური მიმღები ანგარიშები და parity გადაწყვეტილებების დაკარგვის რეალურ დროში გზები.
შესაბამისობის ვექტორებიმრავალენოვანი ჩანართები ადასტურებენ SDKs ამავე მანიფესტების, სეგმენტებისა და ენტროპული ნაკადების დეკოდირებას.

სტრიმინგის სპეციფიკური კოდექები და ენტროპული პროფილი განცალკევებულია Norito ტრანზაქციის/გამოკითხვის ფორმატიდან, მაგრამ მათი მანიფესტები და კონტროლის მონაცემები კვლავ იყენებენ Norito-ს, ასე რომ მარშრუტირება, ანგარიშსწორება, გათამაშება და აუდიტის მტკიცებულებები რეპროდუქციული რჩებიან.

საოპერაციო მიმართულებები

  • SDK მშენებლები და წარმოქმნილი ბმულები ხელნაკეთი დამზადებული Norito ბიტების ნაცვლად.
  • განიხილეთ სქემის შეუსაბამობა როგორც ვერსია ან მოწყობილობის პრობლემა, და არა როგორც გარდამავალი ქსელის უკმარისობა.
  • არქივი .nrt, .norito და მანიფესტური არტეფაქტები გათავისუფლების ან ინციდენტის ბუნდელში, რომელმაც ისინი გამოიწვია.
  • გამოიყენეთ Norito როგორც სიმართლის წყარო ხელმოწერილი, ჰაშირებული ან შეჩერებული მონაცემებისთვის. გამოიყენეთ პროექციები JSON დაშბორდებისა და სახელმძღვანელო ინსპექტირებისათვის.
  • ახალი ტიპირებული Torii საბოლოო წერტილის დამატებისას, დოკუმენტაცია იმის შესახებ, მიიღებს თუ არა ის JSON, Norito ან ორივე და გამოაქვეყნეთ მხარდაჭერილი შინაარსის ტიპები /openapi.
  • სანამ აჩქარებელი გააქტიურებთ, შეამოწმეთ პარიტეტის ტესტები სკალარული გამომუშავების წინააღმდეგ. თუ აჩქარო ვერ გამოვა, გამოიყენეთ დეტერმინისტური სკალარული ჩავარდნა. სასარგებლო დატვირთვის სემანტიკა უნდა დარჩეს უცვლელი.

წინსავალი რეფერენციები