স্বচ্ছতা এবং প্রমাণযোগ্য ন্যায্যতা নিশ্চিত করতে আমরা প্রতিটি মাল্টিপ্লেয়ার গেমের জন্য ১ কোটি SHA256 হ্যাশের একটি চেইন তৈরি করেছি, একটি সার্ভার সিক্রেট দিয়ে শুরু করে যা বারবার SHA256-এর আউটপুট নিজের মধ্যে ১ কোটি বার ফিড করা হয়েছে
Platform-এর জন্য চূড়ান্ত হ্যাশের SHA256 হল: eeb4d340bfaed702601b9a08faba2f8088c4810c3e3a883293accaf25053b883
Crash-এর জন্য চূড়ান্ত হ্যাশের SHA256 হল: c46f0705f6ba4df891ce44accda8f89f5a6fa8b987eb7c7b445280cf6cabfbc6
Battle-এর জন্য চূড়ান্ত হ্যাশের SHA256 হল: 63cb1eb64ec4eb4de02f6bad85e42365d08f37497a1b7e907bd0b9183f27e1b3
এটি এখানে প্রকাশ করে আমরা যেকোনো বিকল্প SHA256 চেইন বেছে নেওয়ার ক্ষমতা প্রতিরোধ করছি। এখন গেম সার্ভার বিপরীত ক্রমে এই হ্যাশ চেইনের মধ্য দিয়ে খেলছে, এই মানগুলি ব্যবহার করে গেমের ফলাফল প্রমাণযোগ্যভাবে ন্যায্যভাবে গণনা করছে।
১. সিক্রেট প্রাথমিক হ্যাশ: প্রতিটি মাল্টিপ্লেয়ার গেমের ধরনের নিজস্ব ব্যক্তিগত প্রাথমিক হ্যাশ রয়েছে (শুধুমাত্র সার্ভারের কাছে পরিচিত), যা একটি অনন্য হ্যাশ চেইনের মূল গঠন করে।
২. হ্যাশ চেইন জেনারেশন: প্রাথমিক সিক্রেট হ্যাশ থেকে, আমরা বারবার SHA256 প্রয়োগ করে ১,০০,০০,০০০ হ্যাশের একটি চেইন তৈরি করি।
func HashSeed(seed string) string {
hash := sha256.Sum256([]byte(seed))
return hex.EncodeToString(hash[:])
}
func CalculateHashChain(firstHash string) []string {
hashes := make([]string, 10_000_000)
for i := int64(0); i <= 10_000_000; i++ {
firstHash = HashSeed(firstHash)
hashes[i] = firstHash
}
return hashes
}
৩. বিপরীত ব্যবহার: আমরা চেইনের চূড়ান্ত হ্যাশ জনসাধারণের কাছে প্রকাশ করি। প্রতিটি গেম রাউন্ড বিপরীত ক্রমে হ্যাশ ব্যবহার করে: রাউন্ড ১ hash[10_000_000] ব্যবহার করে রাউন্ড ২ hash[9_999_999] ব্যবহার করে এবং এভাবে চলতে থাকে...
৪. এই ডিজাইন ভবিষ্যতের হ্যাশ জাল করা অসম্ভব করে তোলে, একইসাথে যে কাউকে সমস্ত পূর্ববর্তী হ্যাশ যাচাই করার অনুমতি দেয়।
অপ্রত্যাশিততা: ভবিষ্যতের গেমের ফলাফল জানা বা প্রভাবিত করা যায় না, এমনকি সার্ভার দ্বারাও নয়।
যাচাইযোগ্যতা: খেলোয়াড়রা শুধুমাত্র প্রকাশ্যে প্রকাশিত চূড়ান্ত হ্যাশ ব্যবহার করে যেকোনো পূর্ববর্তী রাউন্ডের অখণ্ডতা যাচাই করতে পারেন।
গেম বিচ্ছিন্নতা: প্রতিটি গেমের ধরনের নিজস্ব চেইন রয়েছে, ক্রস-গেম ম্যানিপুলেশন প্রতিরোধ করে।
একক-খেলোয়াড় গেমে প্রমাণযোগ্য ন্যায্যতা নিশ্চিত করতে, আমাদের প্ল্যাটফর্ম ফলাফল সিড তৈরি করতে তিনটি প্রধান উপাদানের উপর ভিত্তি করে একটি সিস্টেম ব্যবহার করে:
১. ক্লায়েন্ট সিড: এটি একটি ব্যবহারকারী-নিয়ন্ত্রিত সিড। একজন ব্যবহারকারী নিবন্ধন করলে এটি স্বয়ংক্রিয়ভাবে তৈরি হয়, তবে ব্যবহারকারী যেকোনো সময় এটি পরিবর্তন করতে পারেন। ক্লায়েন্ট সিড পরিবর্তন করলে একটি নতুন সার্ভার সিড তৈরি শুরু হয়।
২. সার্ভার সিড: এটি সার্ভার দ্বারা অভ্যন্তরীণ পরামিতি ব্যবহার করে তৈরি করা হয় যা ব্যবহারকারীর কাছে প্রকাশ করা হয় না। এটি বর্তমান ক্লায়েন্ট সিডের সাথে অনন্যভাবে আবদ্ধ। প্রতিটি ক্লায়েন্ট সিডের জন্য, একটি সংশ্লিষ্ট সার্ভার সিড রয়েছে। যখন ব্যবহারকারী ক্লায়েন্ট সিড পরিবর্তন করেন, পূর্ববর্তী সার্ভার সিড যাচাইকরণের উদ্দেশ্যে প্রকাশ করা হয়।
৩. নন্স: বাজির টাইমস্ট্যাম্পের (মিলিসেকেন্ডে) উপর ভিত্তি করে একটি অনন্য সংখ্যা। এটি নিশ্চিত করে যে এমনকি পুনরাবৃত্তিমূলক কর্মও ভিন্ন ফলাফল উৎপন্ন করে।
এই তিনটি মান একত্রিত করা হয় এবং HMAC-SHA256 ব্যবহার করে হ্যাশ করা হয় চূড়ান্ত গেম সিড তৈরি করতে, যা তারপর গেমের ফলাফল নির্ধারণ করতে ব্যবহৃত হয়।
func GenerateUserGameSeed(userSeed string, userServerSeed string, nonce int64) (string, error) {
data := fmt.Sprintf("%s:%s:%d", userServerSeed, userSeed, nonce)
mac := hmac.New(sha256.New, []byte(data))
gameSeed := hex.EncodeToString(mac.Sum(nil))
return gameSeed, nil
}
কোনো বাজি রাখার আগে সার্ভার বর্তমান সার্ভার সিডের হ্যাশ করা সংস্করণ প্রদান করে।
ব্যবহারকারী তাদের ক্লায়েন্ট সিড পরিবর্তন করার পরে, পূর্বে ব্যবহৃত সার্ভার সিড প্রকাশ করা হয়।
এটি ব্যবহারকারীদের যাচাই করতে দেয় যে পূর্ববর্তী সার্ভার সিড দিয়ে তৈরি সমস্ত ফলাফল সামঞ্জস্যপূর্ণ এবং ন্যায্য ছিল।