این مقاله به دنبال ارائه جایگزینی برای سیستم رایگیری الکترونیکی موجود است. موارد تقلب و روند مشکوک انتخاباتی موضوع تکراری در انتخابات است. طبق یک نظرسنجی، از هر ۵ نفر ۳ نفر معتقدند که حملات سایبری به زودی میتواند در انتخابات کشورشان دستکاری ایجاد کند. هر چند متخصصان ادعا میکنند که سیستم رایگیری الکترونیکی بهترین گزینه برای برگزاری یک انتخابات سالم است، ولی عدم اعتماد به سیستم فعلی قانونی بودن نامزد برنده را به خطر میاندازد. اما تکنولوژی بلاک چین (Blockchain) راه حل بسیار خوبی برای این مسئله است.
در سراسر جهان، روند مشکوک انتخاباتی موضوعی است که دائم تکرار میشود. حتی Wikipedia لیستی از تمام انتخابات بحثبرانگیز را دارد که بر اساس تاریخ تنظیم شده است. هر کدام دارای ویژگیهای مخصوص به خود است، اما وجه مشترک همه این انتخابات ناامنی در سیستم انتخاباتی است. بنا به تحقیقی از مرکز پژوهشهای Pew، برای ۷۸ درصد از مصاحبهشوندگان دولت قادر به مقابله با تهدیدهای مجازی نیست.
انتخابات قبل از راه حل بلاک چین چگونه است؟
سیستم دیجیتالی انتخاباتی فعلی ۲ ترمینال دارد. مامور سنجش حوزه از یکی از این ترمینالها برای تایپ شماره ثبت رایدهندگان استفاده میکند تا بررسی کند که آیا شخص مورد نظر حق رای دادن دارد یا خیر؟ بعد از عبور از این مرحله، رایدهنده به ترمینال بعدی میرود؛ یعنی جایی که میتواند به نامزد انتخابیاش رای بدهد.
ثبت رایگیری به صورت رمزگذاری و دارای امضای دیجیتالی است. بعد از پایان رایگیری، صندوق رایگیری مجموع کل آراء اخذ شده در آن شعبه را ثبت میکند و یک نسخه از آن را برای بازرسان احزاب جهت بررسیهای بعدی ارسال میکند. این اسناد در یک صندوق مهر و موم شده گذاشته میشوند و به نقطهای برده میشوند که از آنجا دادهها از طریق یک شبکه خصوصی به دادگاه انتخابات فرستاده میشود. چندین بررسی امنیتی با استفاده از رمزگذاری انجام میشود و آراء ذخیره میشوند و در صورت معتبر بودن دادهها بعدا شمارش میشوند.
حتی اگر تمام مراحل توضیح داده شده برای تضمین امنیت در ذخیرهسازی دادهها موجود و درست باشد، یک احساس بین مردم وجود دارد که روند انتخابات میبایستی قابل اطمینانتر باشد. کلام رایج این است که وقتی در انتخابات، رایها چاپی هستند، به صورت فیزیکی ذخیره میشوند و در صورت لزوم قابل شمارش مجدد هستند.
هنوز چندین کشور از قبیل آمریکا، فیلیپین و آرژانتین هستند که به جای رای الکترونیکی از رای نوشتاری و چاپی استفاده میکنند. چرا که ادعا میکنند امنترین راه است. اگر چه در این روش هویت افراد مشخص است، ناگفته نماند که تقلب نیز بسیار آسان است؛ چرا که امکان تعویض صندوقهای رای وجود دارد. میتوانیم بپذیریم که در هر دوی این سیستمها ساختار رایگیری فاقد شفافیت لازم است.
در این سناریوی عدم اعتماد، میتوان مزایای پیادهسازی یک سیستم مبتنی بر بلاک چین را شناسایی کرد. بلاک چین یک نقطه ضعف اصلی و اساسی ندارد و در برابر حملات مخرب مقاومتر است؛ زیرا بلاک چین یک فنآوری ثبت دادهها به صورت توزیع شده است.
قبلا به طور مفصل در مورد استفاده از یک سیستم بلاک چینی بحث شده است. در سال ۲۰۱۸ در یک شهر ژاپن استفاده از بلاک چین در انتخابات، به صورت آزمایشی مورد استفاده قرار گرفت. سیستم مورد استفاده، شبیه رایگیری مرسوم و متعارف بود؛ با این تفاوت که از تعداد کارتهای تامین اجتماعی برای تایید استفاده میکرد و امکان رای دادن به دادخواستها و پروژهها را برای شهروندان فراهم میکرد، بدون این که نیاز باشد از خانه خارج شوند.
نقش بلاک چین در انتخابات
بهترین روش برای اجرا و پیادهسازی فرآیند رایگیری از طریق بلاک چین ، توسعه یک سیستم موازی است. بلاک چین یک پایگاه داده غیرمتمرکز است که تاریخچه داراییها و تراکنشها بین رایانههای موجود در یک شبکه را ذخیره میکند. برای پروژه انتخابات، “دارایی” همان “رای” و “نسبت دادن رای به یک نامزد” همان تراکنش خواهد بود.
بلاک چین به همه نودها، یعنی همه رایانههای موجود در شبکه منتقل میشود. برای رای دادن، رای دهنده خود را شناسایی میکند و توکن تولید میشود که رشتهای از کاراکترها است (رمز) و بهطور مستقیم نمیشود آن را خواند. کد شناسایی و رمز به یک تایید کننده ارسال میشوند و او بررسی میکند که آیا این شخص قبلا رای داده است یا نه. اطلاعات مربوط به هر تراکنش جدید به تمام نودهای موجود در شبکه ارسال میشود و اطلاعاتی تغییرناپذیر از رای ثبت میگردد. بعد از عبور از این مرحله، رای دهندگان میتوانند رای خود را به نامزد انتخابی خود بدهند و در نهایت، رای آنها به عنوان یک تراکنش در بلاک چین ثبت میگردد.
به نظر ما استفاده از یک شبکه بلاک چین خصوصی بهتر خواهد بود؛ شبکه بلاک چین های خصوصی، برای دسترسی به اطلاعات خصوصی است و برای خواندن اطلاعات موجود در زنجیره شما، دعوتنامه و تایید آن از طرف مسئول شبکه یا از طرف مجموعه قوانین اجرا شده در شبکه الزامی است. از همان آغاز، هر نود نقش مهمی در حفظ غیرمتمرکز بودن بلاک چین ایفا میکند. برای تضمین برابری و شفافیت هر چه بیشتر شبکه، نودها را بین دولت، شرکتها، احزاب سیاسی و رای دهندگان تقسیم میکنیم.
نمودار زیر درصد نودها را در هر گروه در یک شبکه خصوصی نشان میدهد:
نیمی از نودها در اختیار دولت است. به این ترتیب از حملهی ۵۱ درصدی جلوگیری میکنیم. حمله ۵۱ درصد زمانی اتفاق میافتد که یک ماینر یا گروهی از ماینرها سعی در کنترل بیش از ۵۰ درصد از توان استخراج یک شبکه را دارند، که در این صورت قادر خواهند بود از تراکنشهای جدید و یا تایید آنها جلوگیری کنند. مدیریت این نودها کاملا از مدیریت مسئول فعلی جدا خواهد بود و به همین خاطر ۵۰ درصد نودها را در اختیار دولت میگذاریم تا استقلال شبکه را تامین و تضمین نماییم.
کنترل شبکه در دست اشخاص و شرکتها نیز هست. در هر دوی این موارد، فقط امکان تخصیص یک نود به کد شناسایی هر خانه یا شرکت وجود دارد. همچنین کارمندان شرکتهایی که نود دارند، خود نمیتوانند نود داشته باشند. سهمی از نودها به احزاب اختصاص مییابد که به طور مساوی بین تمام احزاب سیاسی تقسیم میشود. افراد وابسته به احزاب هم مانند کارمندان شرکتها نمیتوانند نود داشته باشند.
پیاده سازی بلاک چین
در این بخش ما قصد داریم که چگونگی اجرای یک بلاک چین ساده را در عمل نشان دهیم. ما میتوانیم از خدمات بسیار متمرکزتر در بلاک چین مانند هایپرلجر استفاده نماییم.
هر چند در صورت توسعه بلاک چین از ابتدا، احتمال کنترل بیشتر بر ساختا دادهها و روش تایید تراکنشها و اعتبار سنجی آنها بیشتر است. بیایید ساختار( struct ) هر یک از بلوکها را که تشکیل دهنده بلاک چین هستند، مشخص کنیم و تعریف نماییم. همانطور که مشاهده کردیم هر بلوک نشان دهنده یک رای واحد است. در یک برنامه کاربردی در دنیای واقعی، بهتر آن است که بیشتر از یک رای داشته باشیم. و این کار را میتوان با پیاده سازی یک درخت درون ساختار انجام داد.
type Block struct {
Index int
Timestamp string
Vote string
Hash string
PrevHash string
Difficulty int
Nonce string
Address string
}
اجازه دهید مدل خود بلاک چین را بسازیم که به سادگی یک ساختار است که شامل مجموعهای از بلوکهاست.
type Blockchain struct { Chain []Block }
ما برای شناسایی و تعریف PrevHash در هر بلوک با هش ایجاد شده در بلوک قبلی از هش استفاده میکنیم. با این کار اطمینان حاصل میکنیم که ترتیب بلوکها صحیح است. ما همچنین تابعی نوشتیم که دادهها و اطلاعات بلوک را میگیرد و یک هش SHA256 از آن ایجاد میکند.
func calculateHash(block Block) string {
record := string(block.Index) + block.Timestamp + block.Vote + block.PrevHash + block.Nonce
h := sha256.New() h.Write([]byte(record))
hashed := h.Sum(nil)
return hex.EncodeToString(hashed)
}
اکنون میتوانیم با اجرای تابع جدید GenerateBlock یک بلوک جدید با تمام عناصر مورد نیاز تولید کنیم. توجه داشته باشید که ما برای مشکلترکردن نود و یا عدم ایجاد نود جدید از nonce استفاده میکنیم.
func GenerateBlock(oldBlock Block, data string, key string) (Block, error) {
var newBlock Block
newBlock.Index = oldBlock.Index + 1
newBlock.Timestamp = time.Now().String()
newBlock.Vote = data
newBlock.Address = wallet.GetPlbAddress(key)
newBlock.PrevHash = oldBlock.Hash
newBlock.Difficulty = difficulty
for i := 0; ; i++ {
hex := fmt.Sprintf(“%x”, i)
newBlock.Nonce = hex
if !checkHashValidation(calculateHash(newBlock), newBlock.Difficulty){
fmt.Println(calculateHash(newBlock))
time.Sleep(time.Second)
continue
} else {
fmt.Println(calculateHash(newBlock), ” work done!”)
newBlock.Hash = calculateHash(newBlock) break
}
}
return newBlock, nil
}
سپس باید مطمئن شویم که بلوکها دستکاری نشدهاند. که این کار را با بررسی ۳ مورد انجام میدهیم:
- با بازبینی شاخص (index) برای حصول اطمینان از افزایش طبق انتظار.
- با اطمینان از اینکه PrevHash ما در واقع همان Hash بلوک قبلی است.
- و سرانجام با کنترل مجدد هش بلوک فعلی از طریق اجرای تابع calculateHash بر روی بلوک فعلی.
func checkBlockValidation(newBlock, oldBlock Block) bool {
if oldBlock.Index+1 != newBlock.Index {
return false
}
if oldBlock.Hash != newBlock.PrevHash {
return false
}
if calculateHash(newBlock) != newBlock.Hash {
return false
}
return true
}
یکی از اصول معماری بلاک چین شبکه همتا به همتای آن است. یک کتابخانه عالی همتا به همتا در زبان برنامهنویسی Go به نام go-libP2P نوشته شده است. بیایید ابتدا ساختار هر یک از نودهای خود را که بلاک چین ما را ایجاد میکند تعریف و مشخص نماییم. همانطور که مشاهده میکنید هر نود حاوی ساختار بلاک چین P2PNode و همچنین یک جزء اشتراک و انتشار است.
type Node struct {
p2pNode host.Host
blockchain *blockchain.Blockchain
pubsub *floodsub.PubSub
}
پس از ایجاد این ساختار، تابع GetNewAddress وظیفه دارد که نودهای دیگر را در همسایگی خود معین کند و دادهها را دریافت و انتقال دهد.
func (node *Node) GetNewAddress() *types.GetNewAddressResponse {
var res types.GetNewAddressResponse
w := wallet.NewWallet()
addr := w.GetPrivateKey()
res.Address = addr
return &res
}
ما همچنین به یک سیستم برای ایجاد یک بلوک جدید و توزیع آن برای نودهای دیگر نیاز داریم. تابعی که مسول این کار است BroadcastBlock نامیده میشود:
func (node *Node) BroadcastBlock(t *Transaction) *types.SendTxResponse{
var res types.SendTxResponse
last_index_block := len(node.blockchain.Chain) – 1
newBlock,e := blockchain.GenerateBlock(node.blockchain.Chain[last_index_block], t.Vote, t.Key)
mutex.Lock()
if e != nil {
log.Printf(“ERROR: Could not generate block”)
} else {
node.blockchain.CreateChain(newBlock)
data, err := json.Marshal(node.blockchain)
if err != nil{
log.Printf(“ERROR: Could not send block”)
}
node.pubsub.Publish(“blocks”, data)
}
mutex.Unlock()
res.Txid = newBlock.Hash return &res
}
برای دسترسی به کل نقشه تحقق این پروژه، لطفا به مخزن Github ما مراجعه كنيد. آنجا شما میتوانید دریابید که چگونه جستجوی نودهای جدید را پیادهسازی کردهایم. و متوجه میشوید که چطور تبادل دادهها اجرا میگردد.
نتیجه گیری
استفاده از سیستم رایگیری مبتنی بر بلاک چین قبلا به طور مفصل مورد بحث قرار گرفته است. ما پیشنهاد میکنیم که یک فرآیند رایگیری را پیاده سازی کنیم که از فنآوری بلاک چین استفاده میکند؛ به عبارت دیگر سیستمی به موازات سیستمی که قبلا مورد استفاده واقع شده است را توسعه و گسترش دهیم.
برای تضمین بیشترین مقدار شفافیت و برابری نودها را بین دولت، شرکتها، احزاب سیاسی و رای دهندگان توزیع میکنیم. ما همچنین نحوه پیادهسازی یک بلاک چین ساده را در Go نشان دادیم.