# Vocdoni Ballot Protocol का परिचय

# **Vocdoni Ballot Protocol**

Vocdoni के कोर प्रोटोकॉल की सबसे बड़ी नवीनता यह है कि यह अपनी तरह का पहला विकेंद्रित, सेंसरशिप-रोधी और गुमनाम ऑनलाइन वोटिंग प्रोटोकॉल है। पर इन तकनीकी महत्वाकांक्षाओं से आगे बढ़कर यह प्रोटोकॉल तरह-तरह की लोकतांत्रिक प्रक्रियाओं के साथ चल पाता है। Vocdoni यह बात कुछ हद तक मतपत्रों के लिए बनाई गई अपनी लचीली स्पेसिफ़िकेशन के दम पर हासिल करता है।

**Vocdoni Ballot Protocol** (यानी Vocdoni का मतपत्र प्रोटोकॉल) का मकसद है किसी मतदान प्रक्रिया के मतपत्रों और परिणामों को दर्शाने के लिए ऐसी स्पेसिफ़िकेशन देना जो सरल हो, फिर भी दमदार।

# **पहले, कुछ परिभाषाएँ:**

**_मतदान प्रक्रिया_** एक या एक से ज़्यादा **_फ़ील्ड_** से बनती है, और हर फ़ील्ड **_प्रक्रिया के प्रकार_** के हिसाब से या तो कोई एक सवाल दर्शाता है या किसी सवाल का कोई एक विकल्प। वोट डालते समय पात्र मतदाता हर फ़ील्ड के लिए पहले से तय **_उत्तरों_** में से चुनते हैं। उत्तर कितने दिए जा सकते हैं, उत्तर किस तरह का हो वगैरह भी प्रक्रिया के खास प्रकार पर निर्भर करता है। पात्र मतदाता अपनी पसंद **_मतपत्र_** डालकर ज़ाहिर करता है।

मतपत्र प्राकृतिक संख्याओं की एक सरणी, यानी सूची के रूप में दर्शाया जाता है। सरणी की हर जगह प्रक्रिया के किसी एक फ़ील्ड का उत्तर रखती है।

परिणाम प्राकृतिक संख्याओं की दो-आयामी सरणी, यानी एक मैट्रिक्स में जमा होते हैं। इस मैट्रिक्स की हर पंक्ति मतपत्र के एक फ़ील्ड से मेल खाती है और हर स्तंभ उस फ़ील्ड के संभावित मानों में से एक से। परिणाम मैट्रिक्स की हर संख्या बस इतना बताती है कि उस इंडेक्स पर मौजूद मान को कितने वोट मिले।

किसी प्रक्रिया की सेटिंग की बारीकियों में उतरने से पहले चलिए एक आम उदाहरण देख लेते हैं। मान लीजिए हमारे पास तीन फ़ील्ड `A`, `B` और `C` वाली एक प्रक्रिया है, और हर फ़ील्ड में `0`, `1` और `2` संभावित मान के तौर पर चलते हैं। ये मान या फ़ील्ड किसे दर्शाते हैं यह हमें नहीं पता, पर फ़िलहाल इससे कोई फ़र्क नहीं पड़ता।

![चित्र। बाईं ओर दो मतपत्र एक के नीचे एक रखे हैं, और दाईं ओर परिणाम मैट्रिक्स है, जिसकी हर पंक्ति एक फ़ील्ड है और हर स्तंभ एक संभावित मान। हर मतपत्र से निकलकर तीर उस खाने पर जाते हैं जहाँ उस फ़ील्ड की पंक्ति और उस मान का स्तंभ मिलते हैं, और वहीं गिनती एक बढ़ जाती है।](https://storage.googleapis.com/papyrus_images/47fc7647a24d815d609ad569c4456e39.png)

इस उदाहरण में दो वोट डाले गए हैं। पहले मतदाता ने फ़ील्ड `A` के लिए मान `2`, फ़ील्ड `B` के लिए `0` और फ़ील्ड `C` के लिए `1` चुना। दूसरे मतपत्र के मान `0`, `0` और `2` हैं। ऊपर बने चित्र में आप देख सकते हैं कि मतपत्रों का परिणाम मैट्रिक्स से क्या रिश्ता है। मतपत्र के किसी मान का _इंडेक्स_ तय करता है कि वह मान किस _फ़ील्ड_ का है, यानी मतपत्र 1 के पहले इंडेक्स पर मान `2` है, इसलिए मतपत्र 1 फ़ील्ड A को मान `2` दे रहा है। परिणाम मैट्रिक्स के हर फ़ील्ड के भीतर वोट का मान उसके इंडेक्स से दर्शाया जाता है। मान `2` को मिले उस एक वोट को दिखाने के लिए हम `field A` के इंडेक्स `2` पर `1` रख देते हैं।

शायद पहली बार में यह सहज न लगे। पक्की समझ बनाने के लिए किसी एक मतपत्र के दो-चार और मानों को परिणाम मैट्रिक्स तक ट्रैक करके देखिए।

---

# **प्रोटोकॉल असल में क्या है**

मतपत्र प्रोटोकॉल संख्यात्मक और बूलियन (सही/गलत) वेरिएबल के एक समूह से बना है, जो तय करते हैं कि वैध मतपत्र का प्रारूप क्या होगा।

![मतपत्र के वेरिएबल का चित्र। बीच में एक मतपत्र बना है, और उसके इर्द-गिर्द आठ वेरिएबल के नाम लिखे हैं। हर नाम से एक रेखा मतपत्र के उसी हिस्से तक जाती है जिस पर वह वेरिएबल हद बाँधता है: कोई पूरे मतपत्र पर, कोई किसी एक फ़ील्ड पर और कोई सारे फ़ील्ड के जोड़ पर।](https://storage.googleapis.com/papyrus_images/b8d920f2d64cf347ff2f47f7e34a3340.png)

ऊपर दिया गया हमारा उदाहरण इस प्रोटोकॉल में कैसे दर्शाया जाएगा?

शुरुआत करें तो हमें पता है कि हमारे पास तीन फ़ील्ड हैं, इसलिए

- `maxCount` = 3

हमारे मान्य मान 0, 1 और 2 हैं, इसलिए हम यह रख सकते हैं

- `minValue` = 0
- `maxValue` = 2

दूसरे मतपत्र में कई फ़ील्ड के लिए मान `0` है। यह मतपत्र वैध रहे, इसके लिए हमें तय करना होगा

- `uniqueValues` = 0 (यहाँ 0 का मतलब 'गलत' और 1 का मतलब 'सही' है)

अगले तीन वेरिएबल के लिए कोई एक ज़ाहिर सेटिंग नहीं है, तो चलिए अपनी उदाहरण प्रक्रिया में थोड़ा और संदर्भ जोड़ लेते हैं। मान लीजिए यह प्रक्रिया एक ही सवाल पूछती है, जिसमें मतदाताओं को अलग-अलग संगठनों को सोने के सिक्के बाँटने हैं। हर फ़ील्ड एक संगठन दर्शाता है, और उस फ़ील्ड को दिया गया मान बताता है कि मतदाता उस संगठन को कितने सिक्के देना चाहता है।

हमने `minValue` और `maxValue` वेरिएबल पहले ही तय कर दिए हैं, इसलिए हमें पता है कि हर उपयोगकर्ता किसी एक संगठन को 0 से 2 तक सिक्के दे सकता है। पर एक वाजिब नियम हम यह जोड़ सकते हैं कि मतदाता कुल मिलाकर सिर्फ़ 3 सिक्के ही बाँट सकते हैं। और चलिए यह भी मान लेते हैं कि मतदाताओं को कम से कम 1 सिक्का देना _ही होगा_।

इससे ऊपर बने प्रक्रिया चित्र में मतलब जुड़ जाता है। पहला मतपत्र कुल 3 सिक्के बाँटता है (शायद वह मतदाता संगठन A और C का समर्थन करता है, पर A उसे थोड़ा ज़्यादा पसंद है)। दूसरा मतपत्र अपने 3 में से सिर्फ़ 2 सिक्के बाँटता है (वह सिर्फ़ संगठन C का समर्थन करता है और अपना तीसरा सिक्का A या B को देने के बजाय बेकार जाने देना बेहतर समझता है)। तो हम बेफ़िक्र होकर यह रख सकते हैं

- `minTotalCost` = 1
- `maxTotalCost` = 3

और दोनों मतपत्र वैध रहेंगे।

आखिरी वेरिएबल जो हमें तय करना है वह है `costExponent`, जिसका ताल्लुक [क्वाड्रैटिक वोटिंग](https://www.wikiwand.com/en/Quadratic_voting) से है। इस तरह के मतदान में हम फ़िलहाल नहीं उतरेंगे, तो चलिए बस डिफ़ॉल्ट मान रख देते हैं

- `costExponent` = 1

एक बार फिर, इनमें से हर वेरिएबल पर थोड़ा रुककर सोचिए और देखिए कि इनमें से कोई एक बदलने पर हमारी उदाहरण मतदान प्रक्रिया पर क्या असर पड़ेगा।

# **परिणामों की पार्सिंग**

ऊपर दिए गए वेरिएबल ही पूरा Vocdoni Ballot Protocol हैं, जो मतपत्र की जाँच और परिणामों की गणना दोनों समेटता है और यह काम कोर इन्फ़्रास्ट्रक्चर के ज़िम्मे रहता है। पर इंसानी अनुभव की बात करें तो साफ़ है कि अभी बहुत सारी जानकारी छूट रही है। प्रोटोकॉल का इस्तेमाल करने वालों को यह तय करना पड़ता है कि प्रक्रिया की असल सामग्री मतदाताओं तक कैसे पहुँचाई जाए, और परिणाम मैट्रिक्स को कैसे पार्स और पेश किया जाए। परिणामों की पार्सिंग Ballot Protocol के दायरे से बाहर है, फिर भी यह समझने के लिए मायने रखती है कि प्रोटोकॉल का इस्तेमाल कैसे हो सकता है।

अपने मौजूदा रूप में Vocdoni परिणाम पार्सिंग के दो प्रारूप तय करता है: **_इंडेक्स-भारित_** और **_पृथक मान_**।

### **इंडेक्स-भारित**

अपनी उदाहरण प्रक्रिया के लिए हम इंडेक्स-भारित व्याख्या का फ़ॉर्मूला इस्तेमाल करेंगे। यह स्कीमा एक ही सवाल वाली प्रक्रियाओं के लिए ठीक बैठता है, जैसे वरीयता-क्रम मतदान, बहुविकल्पी मतदान या सहभागी बजट। परिणाम मैट्रिक्स के किसी फ़ील्ड का हर इंडेक्स एक भारित मान दर्शाता है, और यहाँ यह भार बताता है कि किसी संगठन को कितने सिक्के दिए गए। वोटों के जोड़ को उनके इंडेक्स-भारित मानों से गुणा करने पर उस फ़ील्ड का कुल मान निकलता है।

![चित्र। बाईं ओर परिणाम मैट्रिक्स की तीन पंक्तियाँ हैं। हर पंक्ति के हर खाने के ऊपर उसके स्तंभ का इंडेक्स लिखा है, और नीचे गुणा का काम दिखाकर तीर उसे दाईं ओर एक अकेली संख्या तक ले जाता है। इस तरह हर पंक्ति सिमटकर एक ही आँकड़ा रह जाती है।](https://storage.googleapis.com/papyrus_images/345a07aee1ddf6a6aad51db7e58fd399.png)

यह व्याख्या हमारी उदाहरण प्रक्रिया को जोड़कर दिखाती है। संगठन A को 2 सिक्के मिलते हैं, संगठन C को 3।

### **पृथक मान**

पृथक मान वाली व्याख्या उन प्रक्रियाओं में इस्तेमाल होती है जहाँ हर फ़ील्ड खुद एक अलग सवाल है। यहाँ हर मान कोई एक अलग विकल्प दर्शाता है (जैसे 'उम्मीदवार 2'), न कि कोई गुणक (जैसे 'इस विकल्प को 2 अंक')। इसलिए यह तरीका परिणाम बस इतना बताकर पेश करता है कि हर फ़ील्ड में किस मान को, अगर किसी को, सबसे ज़्यादा वोट मिले।

विकल्पों के बीच बराबरी के लिए `0` सुरक्षित रखा गया है।

![चित्र। बाईं ओर तीन सवालों की पंक्तियाँ हैं, और हर पंक्ति में तीन विकल्पों की गिनती। हर पंक्ति में सबसे बड़ी गिनती वाला खाना उभारकर दिखाया गया है, और तीर उसी विकल्प की जगह को दाईं ओर के नतीजे तक ले जाता है। तीसरी पंक्ति में कोई खाना नहीं उभरा, क्योंकि तीनों गिनतियाँ बराबर हैं।](https://storage.googleapis.com/papyrus_images/97e8bca257a9b118b86ee3dd31165107.png)

ये दोनों प्रारूप पूरी सूची नहीं हैं। जैसा ऊपर बताया, Ballot Protocol खुद इस बात से बेपरवाह है कि परिणाम कैसे जोड़े जाते हैं, और प्रोटोकॉल के ऊपर अपनी एप्लिकेशन लेयर बनाने वाला कोई भी परिणामों की अपनी व्याख्या तय कर सकता है।

---

# **उदाहरण**

चलिए असल दुनिया के दो उदाहरण देख लेते हैं, ताकि आपको अंदाज़ा हो जाए कि Ballot Protocol कितना लचीला है।

### **वरीयता-क्रम वोटिंग**

मैं एक कैंडी कंपनी चलाता हूँ। हम लॉलीपॉप का एक नया फ़्लेवर लॉन्च करने वाले हैं और बाज़ार परीक्षण करके यह जानना चाहते हैं कि ग्राहकों को कौन सा फ़्लेवर सबसे ज़्यादा पसंद आएगा। हमने अपने कुछ सबसे वफ़ादार ग्राहकों को एक डिब्बा भेजा है, जिसमें `शतावरी`, `सेम`, `गाजर` और `सोआ` फ़्लेवर वाले लॉलीपॉप हैं (हम कोई बहुत कामयाब कैंडी कंपनी नहीं हैं ☹)। हम उनसे कह रहे हैं कि वे Vocdoni की एक मतदान प्रक्रिया में लॉलीपॉप को क्रम में रखकर अपनी पसंद बताएँ…

ऐसे में [वरीयता-क्रम मतदान](https://www.wikiwand.com/en/Ranked_voting) की प्रक्रिया एकदम सही बैठती है। हम अपने परीक्षकों के लिए प्रक्रिया ऐसे बनाएँगे:

हमारे पास कैंडी के चार अलग-अलग फ़्लेवर हैं जिन्हें क्रम में रखना है। उपयोगकर्ताओं को हर कैंडी को एक मान देना है, इसलिए हर तरह की कैंडी के लिए अलग फ़ील्ड चाहिए।

- `maxCount` = 4

हम उपयोगकर्ताओं से कहेंगे कि वे कैंडी को सबसे अच्छी से सबसे खराब के क्रम में रखें, जहाँ `3` सबसे अच्छी है और `0` सबसे खराब।

- `minValue` = 0
- `maxValue` = 3

हमारे परीक्षकों को कुछ कैंडी एक जैसी अच्छी लगें तो इससे हमारा काम नहीं बनता, हमें सबसे अच्छी से सबसे खराब तक साफ़ क्रम चाहिए।

- `uniqueValues` = 1

उपयोगकर्ताओं को चार अलग-अलग मान देने ही पड़ेंगे, इसलिए हमें पता है कि कुल लागत 0+1+2+3=6 होगी।

- `minTotalCost` = 6
- `maxTotalCost` = 6

यहाँ भी costExponent हमारे किसी काम का नहीं है।

- `costExponent` = 1

![चित्र। खाली परिणाम मैट्रिक्स, जिसकी चार पंक्तियों पर शतावरी, सेम, गाजर और सोआ लिखा है और चार स्तंभों पर 0 से 3 तक के मान। हर खाने में अभी गिनती शून्य है।](https://storage.googleapis.com/papyrus_images/d06d57a97367e2f40ed75228f02392a7.png)

चलिए अपना पहला मतपत्र देखते हैं। इस उत्पाद परीक्षक को गाजर बहुत पसंद है, इसलिए वह गाजर को पहली पसंद का दर्जा देता है। फिर आती है शतावरी, फिर सोआ, और सेम सबसे आखिर में रहती है। यह मतपत्र परिणाम मैट्रिक्स में ऐसे दर्ज होता है:

![चित्र। बाईं ओर मतपत्र 1 है, जिसमें शतावरी को 2, सेम को 0, गाजर को 3 और सोआ को 1 मिला है। हर मान से एक तीर निकलकर दाईं ओर उसी सब्ज़ी की पंक्ति में उसी मान वाले स्तंभ तक जाता है, और वहीं गिनती एक बढ़ जाती है।](https://storage.googleapis.com/papyrus_images/e63207ba97dca5657af93969f5424cb3.png)

मतपत्र आते रहते हैं और हमें कुल 30 जवाब मिल जाते हैं! पूरी भरी हुई परिणाम मैट्रिक्स के साथ अब हम इंडेक्स-भारित तरीके से अपने परिणाम जोड़ते हैं…

![चित्र। 30 मतपत्रों के बाद भरी हुई परिणाम मैट्रिक्स, जिसकी हर पंक्ति एक सब्ज़ी है और हर स्तंभ 0 से 3 तक का एक मान। हर पंक्ति के आगे तीर उसका इंडेक्स-भारित जोड़ दिखाता है, यानी शतावरी 51, सेम 36, गाजर 37 और सोआ 56।](https://storage.googleapis.com/papyrus_images/49480940bd6ea3db2320d77b587455ae.png)

जीत सोआ की हुई! 🎉 इस विस्तृत बाज़ार शोध की बदौलत जल्द ही आपको अपने मोहल्ले की दुकान पर सोआ फ़्लेवर वाले लॉलीपॉप मिलने लगेंगे।

### **क्वाड्रैटिक वोटिंग**

कामगारों की चलाई हुई हमारी जूता निर्माण सहकारी समिति की वार्षिक सभा इसी हफ़्ते है, जिसमें हम नया मार्केटिंग प्रमुख चुनेंगे। मुकाबला बहुत कड़ा है, और प्रस्ताव यह आया है कि सबको बराबरी का मौका देने के लिए क्वाड्रैटिक वोटिंग इस्तेमाल की जाए।

क्वाड्रैटिक वोटिंग एक ऐसा तरीका है जो मतदाताओं को एक ही उम्मीदवार को कई वोट देने देता है, पर बढ़ती हुई लागत पर। यहाँ चार उम्मीदवार मैदान में हैं और हर सदस्य के पास वोट डालने के लिए ज़्यादा से ज़्यादा 9 'अंक' हैं। पेच यह है कि किसी फ़ील्ड को कोई मान `v` देने की लागत `v` की `costExponent` घात होती है। तो `costExponent` 2 मान लें: उम्मीदवार A को मैं 1 वोट दूँ तो एक अंक लगेगा, पर 2 वोट दूँ तो 4 अंक लगेंगे, और एक ही उम्मीदवार को 3 वोट देने में मेरे पूरे 9 अंक निकल जाएँगे। चलिए इसमें उतरकर बात और साफ़ करते हैं।

हमारे पास चार अलग-अलग उम्मीदवार हैं और उपयोगकर्ता उनमें से कई को वोट दे सकते हैं। इसलिए हर एक का अपना फ़ील्ड होना चाहिए।

- `maxCount` = 4

चलिए एक वाजिब हद बाँध देते हैं कि मतदाता किसी एक उम्मीदवार को कितना मान दे सकता है।

- `minValue` = 0
- `maxValue` = 3

सदस्य मान दोहराएँ तो कोई हर्ज नहीं।

- `uniqueValues` = 0

जैसा हमने ऊपर बताया, सदस्य ज़्यादा से ज़्यादा 9 अंक खर्च कर सकते हैं।

- `minTotalCost` = 0
- `maxTotalCost` = 9

आखिरकार इस वेरिएबल का वक्त आ गया। चलिए इसे 2 कर देते हैं, यानी किसी भी मान की लागत उस मान का वर्ग होगी।

- `costExponent` = 2

![चित्र। क्वाड्रैटिक वोटिंग के लिए खाली परिणाम मैट्रिक्स, जिसकी चार पंक्तियों पर उम्मीदवार A से D तक लिखे हैं और चार स्तंभों पर 0 से 3 तक के मान। हर खाने में अभी गिनती शून्य है।](https://storage.googleapis.com/papyrus_images/a645cc0a4a064387d26dafb4972d053a.png)

चलिए दो-तीन मतपत्र सेटिंग की कल्पना करके देखते हैं कि क्वाड्रैटिक वोटिंग काम कैसे करती है।

**मतपत्र 1**

हमारे पहले मतदाता को किसी भी उम्मीदवार से एतराज़ नहीं है, पर उम्मीदवार B उसे थोड़ा ज़्यादा पसंद है। साथ ही वह अपनी मतदान शक्ति ज़्यादा से ज़्यादा इस्तेमाल करना चाहता है।

![चित्र। बाईं ओर मतपत्र 1 है, जिसमें उम्मीदवार A को 1, B को 2, C को 1 और D को 1 मिला है, और हर मान के आगे कोष्ठक में उसका वर्ग लिखा है। हर मान से एक तीर निकलकर दाईं ओर उसी उम्मीदवार की पंक्ति में उसी मान वाले स्तंभ तक जाता है।](https://storage.googleapis.com/papyrus_images/d9e9d195ba9159cc90da7228e4764cfc.png)

इस मतदाता के डाले हर `1` मान से उसकी कुल लागत में सिर्फ़ `1` जुड़ता है। पर `2` मान से कुल लागत में `2^2`, यानी `4` जुड़ता है। सारे उम्मीदवारों में वोट बाँटकर यह मतदाता कुल 5 मान दे पाता है, जबकि लागत सिर्फ़ 7 तक पहुँचती है। वह 9 की अधिकतम कुल लागत तक नहीं पहुँच सकता, क्योंकि अपने किसी भी `1` मान को `2` करने पर लागत 9 से ऊपर चली जाएगी।

**मतपत्र 2**

दूसरे मतदाता की राय बहुत पक्की है। वह सिर्फ़ उम्मीदवार C का समर्थन करता है। इसलिए उसके लिए यही समझदारी है कि उम्मीदवार 3 को अधिकतम मान दे। उसने कुल मान सिर्फ़ `3` इस्तेमाल किया, फिर भी उसकी कुल लागत अधिकतम `3^2` = `9` पर पहुँच जाती है।

![चित्र। बाईं ओर मतपत्र 2 है, जिसमें सिर्फ़ उम्मीदवार C को 3 मिला है और बाकी तीनों को 0। दाईं ओर की परिणाम मैट्रिक्स अब पहले मतपत्र की गिनतियों के ऊपर दूसरे मतपत्र की गिनतियाँ भी जोड़े हुए है।](https://storage.googleapis.com/papyrus_images/99d22c797167c3a9f1a5be94957e158c.png)

आप अंदाज़ा लगा सकते हैं कि ज़्यादा उम्मीदवारों और मतदाताओं वाली बड़ी प्रक्रिया में क्वाड्रैटिक वोटिंग पसंद के साथ-साथ पसंद की तीव्रता नापने का बहुत दमदार तरीका बन सकती है। फ़िलहाल इन परिणामों की व्याख्या हम पाठक पर छोड़ते हैं।

---

# **खुला और लचीला प्रोटोकॉल**

उम्मीद है Vocdoni Ballot Protocol के कुछ मुमकिन इस्तेमालों की अच्छी समझ आपको बन गई होगी। पर प्रोटोकॉल की सबसे अहम खूबी इसका लचीलापन है। ऊपर दिखाई गई सेटिंग के अलावा और भी अनगिनत रूप और व्याख्या के तरीके मुमकिन हैं। ये 8 वेरिएबल इतने हालात समेट लेते हैं कि हमें पता हर तरह का मतदान इनमें आ जाता है, और वे भी जो अभी ईजाद ही नहीं हुए। और यह तो अभी शुरुआती रूप है, ज़रूरत पड़ी तो प्रोटोकॉल और फैलकर और भी संभावनाएँ खोल सकता है।

इस प्रोटोकॉल का तकनीकी लचीलापन और खुलापन असल दुनिया के इस्तेमाल में भी झलकता है। कोई संगठन जितनी आसानी से किसी भी तरह की प्रक्रिया चला सकता है, उससे हर किस्म के फ़ैसले लेने की दहलीज़ नाटकीय रूप से नीचे आ जाती है, चाहे वह पारंपरिक मतदान हो या कुछ ज़्यादा सीधा, तरल और प्रयोगधर्मी। नागरिक समाज के लोगों के पास अब वे साधन हैं जिनसे वे खुद को ताकत दे सकें और ऐसी लोकतांत्रिक प्रक्रियाएँ चला सकें जो _उनका सबसे सही प्रतिनिधित्व करें,_ चाहे वे कैसी भी दिखें।

---

# **नोट: कोड के उदाहरण**

आप में से जो तकनीक-प्रेमी यहाँ तक पहुँचे हैं, उनके लिए शायद ज़मीनी कोड उदाहरणों के बिना इस प्रोटोकॉल का कोई मतलब न बने। यहाँ देखिए कि प्रक्रिया बनाने के लिए आप [dvote-js](https://github.com/vocdoni/dvote-js) का इस्तेमाल कैसे कर सकते हैं, जो इस प्रोटोकॉल का TypeScript/JavaScript कार्यान्वयन है।

पहले सेटअप कर लेते हैं। ज़रूरी पैकेज इंपोर्ट कीजिए, Vocdoni गेटवे से जुड़िए और नकली मतदाताओं की एक मतदाता सूची बनाइए। साथ ही हम मौजूदा ब्लॉक हाइट भी ले लेंगे, ताकि प्रक्रिया के शुरू होने का समय सही तय कर सकें।

_शुरुआती सेटअप, गेटवे से कनेक्शन, मतदाता सूची बनाने वगैरह की ज़्यादा गहराई वाली गाइड के लिए&#xA0;_[_डॉक्युमेंटेशन_](https://docs.vocdoni.io/#/integration/overview)_&#xA0;देखें।_

अब हम अपनी प्रक्रिया का मेटाडेटा बना सकते हैं। चलिए ऊपर बात की गई कैंडी फ़्लेवर वाले उदाहरण के लिए एक प्रक्रिया बनाते हैं। मेटाडेटा वह जानकारी है जो क्लाइंट को मतदान प्रक्रिया ठीक से दिखाने में मदद करती है और जिसमें इंसान के पढ़ने लायक जानकारी रहती है, बिना प्रोटोकॉल के स्तर पर प्रक्रिया की सेटिंग किए। यहाँ हम हर कैंडी फ़्लेवर के लिए एक सवाल तय करते हैं, जिसमें `0` से `3` तक पहले से तय हर विकल्प मान शामिल है। हम एग्रीगेशन और डिस्प्ले के प्रकार भी घोषित करते हैं, जो क्लाइंट को बताते हैं कि परिणाम कैसे पार्स करने हैं और प्रक्रिया उपयोगकर्ताओं को कैसे दिखानी है।

आखिर में हम खुद प्रक्रिया बना सकते हैं। Ballot Protocol के वेरिएबल बस वही रखे जाते हैं जो हमने इस उदाहरण प्रक्रिया के लिए ऊपर तय किए थे, और `uniqueValues` वेरिएबल `envelopeType` के रूप में सेट होता है। इन वेरिएबल के अलावा `processParams` बताता है कि इस प्रक्रिया की मतदाता सूची और मेटाडेटा कहाँ रखे हैं, प्रक्रिया एन्क्रिप्टेड है या गुमनाम या दोनों, यह प्रक्रिया कौन सा इन्फ़्रास्ट्रक्चर इस्तेमाल करे, कब शुरू और कब खत्म हो, और दूसरी सहायक जानकारी।

इस प्रक्रिया को प्रकाशित करने के बाद हम इसे वापस पढ़ सकते हैं, जाँच सकते हैं कि पैरामीटर ठीक सेट हैं, वेब या एप्लिकेशन क्लाइंट को इस तरह की प्रक्रिया दिखाने का निर्देश दे सकते हैं, और मतदान शुरू!
