เครือข่ายสังคมแบบกระจาย

โปรโตคอลเครือข่ายสังคมแบบเพียร์ทูเพียร์

TLDR:

  • Solcial ถูกสร้างขึ้นเพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ใกล้เคียงที่สุดกับแพลตฟอร์มโซเชียลมีเดีย Web2 ในขณะที่ใช้ประโยชน์จากเทคโนโลยี Web3
  • อุปสรรคอย่างหนึ่งที่แพลตฟอร์มที่ใช้บล็อคเชนต้องเผชิญคือค่าธรรมเนียมผู้ใช้ เพื่อขจัดค่าธรรมเนียมผู้ใช้สำหรับการดำเนินการที่ไม่เกี่ยวกับโทเค็นในขณะที่ยังคงความเป็นส่วนตัวและความเป็นเอกฉันท์ Solcial กำลังสร้างเพียร์ทูเพียร์ (P2P) ที่ยึดใน Solana และสร้างขึ้นบน libp2p ที่ส่งเนื้อหา (ฟีด ชอบ ฯลฯ ) ผ่านการควบคุมด้วยตนเองและการจำลองแบบเพียร์
  • เรายังได้พัฒนาโหนดประเภทพิเศษที่มีโปรโตคอลภายนอกเหมือนกับแอปเดสก์ท็อปหรือมือถือทั่วไป พร้อมการเพิ่มประสิทธิภาพเพิ่มเติมที่ออกแบบมาเพื่อจัดการกับเพียร์ที่ทำงานพร้อมกันนับหมื่นที่เรียกว่า Beacon Nodes บีคอนเป็นชุดของบริการปักหมุดที่จะรักษาเนื้อหาของผู้ใช้เมื่อผู้สร้างออฟไลน์และทำให้ผู้ใช้รายอื่นสามารถใช้งานได้ เนื้อหาของผู้ใช้ทั้งหมดถูกจัดเก็บบน IPFS และเข้าถึงได้ผ่านเลเยอร์ P2P โดยไม่ต้องอาศัยเซิร์ฟเวอร์หรือเกตเวย์ที่เซ็นเซอร์ได้

โทโพโลยีเครือข่าย

โหนดสื่อสารผ่านอินเทอร์เน็ตสาธารณะ สร้างเครือข่ายโอเวอร์เลย์เฉพาะสำหรับ Solcial โดยใช้โปรโตคอล HyparView¹ เวอร์ชันดัดแปลง

แต่ละโหนดรักษารายการเพียร์ที่ใช้งานอยู่ด้วยขนาด

log2 (N)+1 โดยที่ N คือขนาดโดยประมาณของเครือข่ายทั้งหมด มูลค่าของ N ถูกดึงออกจากบล็อคเชนโดยการค้นหาจำนวนบัญชีผู้ใช้ที่ลงทะเบียนเป็นปัจจุบัน และอัปเดตเป็นระยะเมื่อจำนวนผู้ใช้เพิ่มขึ้น การเชื่อมต่อกับเพียร์ที่ทำงานอยู่นั้นเสถียร แบบสองทิศทางและต่อเนื่อง และเป็นโหนดที่พวกเขาสื่อสารด้วยโดยตรงในระหว่างการพูดถึงหรือกิจกรรม p2p อื่นๆ แต่ละโหนดยังรักษารายการเพียร์แบบพาสซีฟด้วยขนาด 6(log2(N)+1)ที่ใช้เป็นตัวสำรองในกรณีที่เพียร์ที่ใช้งานอยู่ขาดการเชื่อมต่อหรือไม่ตอบสนอง โปรโตคอลพื้นฐานสำหรับการเชื่อมต่อระหว่างเพียร์ที่ใช้งานอยู่คือ QUIC² พร้อมการเข้ารหัส NOISE ซึ่งทั้งหมดขับเคลื่อนโดย libp2p³

การข้ามผ่าน NAT ทำได้โดยใช้สามวิธีที่ใช้ขึ้นอยู่กับสถานการณ์เครือข่ายของเพียร์ วิธีแรกคือการใช้ IPv6 แทน IPv4 ทุกครั้งที่ทำได้ เพราะในกรณีนี้ไม่จำเป็นต้องใช้ NAT อย่างไรก็ตาม ตามสถิติมีเพียง 40% ของอินเทอร์เน็ตที่ใช้ IPv6⁴

กลไกทางเลือกคือการใช้ AutoNAT โดยใช้โปรโตคอลการระบุตัวตนของ libp2p ที่ถามโหนดอื่นๆ ในเครือข่ายเกี่ยวกับที่อยู่ที่มองเห็นได้ของเครื่องของเรา ที่อยู่นั้นซึ่งเริ่มต้นโดยเพียร์ที่อยู่เบื้องหลัง NAT นั้นได้ลงทะเบียนกับเราเตอร์ของตนไปยังเครื่องเป้าหมายแล้ว

อย่างไรก็ตาม มีสถานการณ์ที่วิธีนี้ใช้ไม่ได้ผล เราจึงถอยกลับไปใช้ตัวเลือกที่สามและน่าเชื่อถือที่สุดแต่มีราคาแพง

ตัวเลือกที่สามคือการใช้โปรโตคอลรีเลย์วงจร libp2p ที่เลียนแบบการทำงานของโปรโตคอล TURN⁶ โดยมีโหนดระดับกลางที่ถ่ายทอดแพ็กเก็ตระหว่างสองเพียร์หลัง NAT บทบาทนี้สามารถสันนิษฐานได้โดยโหนดบีคอนและเพียร์บางตัวที่มี IP สาธารณะที่เลือกใช้รีเลย์ที่มีขีดจำกัดที่กำหนดค่าไว้ ข้อมูลเพิ่มเติมเกี่ยวกับโหนดบีคอนในโพสต์นี้

ตัวตนของเพียร์

เพียร์จะถูกระบุโดยใช้กุญแจสาธารณะของพวกเขาในรูปแบบของ multihash⁷ ที่เท่ากับกุญแจสาธารณะของที่อยู่กระเป๋าเงินของพวกเขาบน Solana ที่ลงทะเบียนกับสัญญา Solcial on-chain วิธีเดียวที่จะถือว่า ID เพียร์สาธารณะที่กำหนดคือการครอบครองคีย์ลับของคู่คีย์ ED25519

คู่คีย์นี้ยังใช้เพื่อสร้างช่องทางที่เข้ารหัสสำหรับข้อความทั้งหมดที่ส่งผ่านระหว่างเพื่อน ตลอดจนวิธีการตรวจสอบความถูกต้องของข้อความที่คาดว่าเจ้าของกระเป๋าเงินจะสร้างขึ้น

การซ้อนทับของสมาชิก

เพียร์ที่มีกุญแจสาธารณะที่ไม่ได้ลงทะเบียนในเครือข่ายจะไม่ได้รับอนุญาตให้เข้าร่วมการซ้อนทับเครือข่าย HyparView และจะถูกแยกออกจากเครือข่าย Solcial Peer-to-Peer โดยอัตโนมัติ

เพียร์ทั้งหมดที่ต้องการเข้าร่วม Solcial p2p จะส่งข้อความ JOIN ไปยังหนึ่งในโหนดบูตสแตรป (โหนดบูตสแตรปบางอันเป็นโหนดบีคอนด้วย) ในหัวข้อ /solcial/public การแนะนำหัวข้อสู่ HyparView เป็นหนึ่งในการแก้ไขของเราในบทความต้นฉบับ

โหนดใด ๆ ที่ได้รับคำขอ JOIN จากเพียร์จะตรวจสอบก่อนว่า multihash มีอยู่ในสายโซ่และเชื่อมโยงกับบัญชี Solcial จากนั้นจะส่งข้อความ FORWARDJOIN ไปยังหนึ่งในเพียร์ที่ใช้งานอยู่โดยตั้งค่าการเดินสุ่มแบบแอ็คทีฟเป็น 3 เทิร์นจะเผยแพร่ข้อความนั้นไปยังเพื่อนร่วมงานที่แอ็คทีฟทั้งหมด โดยเพิ่มจำนวนฮ็อพปัจจุบันทีละหนึ่งจนกว่าจะถึง 3 ฮ็อพ นี่เป็นการบรรเทาการโจมตี DDoS ต่อโหนดบูตสแตรป ตลอดจนเทคนิคการกระจายอำนาจที่มีประสิทธิภาพเพื่อกระจายและสุ่มการเชื่อมต่อระหว่างโหนดให้มากที่สุด

โหนดใด ๆ ที่อยู่ภายใน 3 ฮ็อพของตัวรับ JOIN เริ่มต้นจะส่งข้อความ NEIGHBOR ไปยังผู้ร้องขอ JOIN เริ่มต้นซึ่งสร้างการเชื่อมต่อถาวรระหว่างกัน

ทุกๆ 15 วินาที โหนดจะมีข้อความ SHUFFLE ไปยังเพียร์ที่ใช้งานแบบสุ่มโดยสุ่มตัวอย่างจากเพียร์ที่ทำงานและพาสซีฟ และตั้งค่าความยาวสุ่มเดินของข้อความนี้เป็น 4 เพื่อให้แน่ใจว่าเพียร์ทั้งหมดในเครือข่ายมีข้อมูลใหม่ๆ อยู่เสมอ เพียร์อื่น ๆ ที่พวกเขาสามารถเก็บไว้ในมุมมองแบบพาสซีฟเพื่อวัตถุประสงค์ในการซ่อมแซมเครือข่าย เมื่อใดก็ตามที่เพียร์ที่ใช้งานอยู่ไม่ตอบสนองหรือยกเลิกการเชื่อมต่ออย่างชัดเจน

การพูดถึงอย่างมีประสิทธิภาพ

เฉพาะเพื่อนร่วมงานที่กระตือรือร้นเท่านั้นที่มีส่วนร่วมในการเผยแพร่ข้อความระหว่างเพื่อน เพียร์ที่ใช้งานจะสร้างเครือข่ายโอเวอร์เลย์บนอินเทอร์เน็ตสาธารณะ และมีวงจรอยู่ในกราฟการเชื่อมต่อระหว่างโหนด เพื่อให้การกล่าวถึงข้อความระหว่างเพื่อนในเครือข่ายเป็นไปอย่างมีประสิทธิภาพ เราต้องลดการแพร่กระจายข้อความที่ซ้ำกันระหว่างเพื่อนและคนที่สองก่อน ให้ค้นหาเส้นทางที่เหมาะสมที่สุดสำหรับข้อความ

สิ่งนี้ทำได้โดยใช้อัลกอริธึม Epidemic Broadcast Trees8 ที่สร้างแผนผังการแผ่ขยายขั้นต่ำระหว่างเพียร์ โดยแยกเพียร์ออกเป็นกลุ่มของโหนดแบบกดกระตือรือร้นและโหนดแบบพุชที่ขี้เกียจ Eager-push nodes มักจะได้รับข้อความที่ส่งต่อทันทีที่ได้รับจากโหนดใดๆ

Lazy push nodes จะได้รับเป็นระยะ ๆ ทุกๆ 500ms เป็นกลุ่มของรหัสข้อความที่โหนดปัจจุบันเห็น เมื่อใดก็ตามที่โหนดสังเกตว่ามี id ข้อความในชุด lazy-push ที่ไม่ได้รับจากโหนดหลักต้นน้ำ โหนดจะสร้างการเชื่อมต่อใหม่ (GRAFT) และกู้คืนสถานะแอ็คทีฟพุช นี่ถือเป็นกลไกการซ่อมแซมต้นไม้ขยายขั้นต่ำในกรณีที่โหนดใดโหนดหนึ่งหยุดทำงานและเกิดกราฟที่ไม่ต่อเนื่องกัน ข้อความ GRAFT จะคืนค่าการเชื่อมต่อเครือข่ายทั้งหมด

เมื่อใดก็ตามที่พบว่าข้อความที่ได้รับซ้ำกับข้อความที่ได้รับก่อนหน้านี้จากโหนดที่ทำงานอยู่ การเชื่อมต่อกับโหนดนั้นถือเป็นวงจรในกราฟและเปลี่ยนเป็น Lazy-Push โดยการส่งข้อความ PRUNE

อีกกรณีหนึ่งสำหรับการตัดการเชื่อมต่อที่แอ็คทีฟและแทนที่ด้วยการเชื่อมต่อจากรายการที่ข้าลง คือเมื่อเราสังเกตว่าจำนวนการกระโดดของข้อความที่ส่งถึงเราผ่านโหนดที่ช้านั้นน้อยกว่า 4 ฮ็อพจากข้อความเพียร์ที่กระตือรือร้นที่กระตือรือร้น ที่ประกอบเป็นอัลกอริธึมการเพิ่มประสิทธิภาพแผนผังการกระจายข่าว

การเผยแพร่เนื้อหา

ข้อความที่พูดคุยผ่านโปรโตคอล p2p ที่อธิบายไว้ในส่วนก่อนหน้านี้คือข้อความ IPFS Bitswap⁹ ที่มี CID ของเนื้อหาที่สร้างโดยผู้ใช้ Solcial เพื่อให้เข้าใจวิธีการใช้ Bitswap และ IPFS ใน Solcial ได้ดีขึ้น อันดับแรก เรามาอธิบายโครงสร้างของโปรไฟล์ผู้ใช้กันก่อน

บัญชีผู้ใช้แต่ละรายในเครือข่ายมีสิ่งที่เรียกว่าดัชนีโปรไฟล์ ดัชนีนี้ชี้ไปที่ CID ของเนื้อหาเวอร์ชันล่าสุด ดัชนีนี้เป็น CRDT ลำดับที่สม่ำเสมอในที่สุด ซึ่งสร้างบันทึกการดำเนินการที่ไม่เปลี่ยนรูปของการดำเนินการที่ดำเนินการโดยบัญชี

ดัชนีโปรไฟล์ถือเป็นรายการที่เชื่อมโยง โดยองค์ประกอบแต่ละส่วนจะชี้ไปที่ CID ขององค์ประกอบก่อนหน้า และเพื่อนร่วมงานจะยอมรับเป็นองค์ประกอบถัดไปตามลำดับก็ต่อเมื่อลงนามโดยคีย์ส่วนตัวของเจ้าของบัญชีเท่านั้น ตัวอย่างเชิงตรรกะระดับสูงของฟีดโปรไฟล์ที่โพสต์ซึ่งเข้ารหัสในรูปแบบนี้มีลักษณะดังนี้:

{

“author”: “12D3KooWSoeYKbpkb5UoL2T5eiomWRHdxR9cPC4tk11gKU89fFwT”,

“prev”: “QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk”,

“action”: “append-feed-post”,

“timestamp”: “2022–01–11T15:58Z”,

“params”: {

“content”: “QmV8cfu6n4NT5xRr2AHdKxFMTZEJrA44qgrBCr739BN9Wb”

“enckey”: “z2DhMLJmV8kNQm6zeWUrXQKtmzoh6YkKHSRxVSibscDQ7nq”

},

“signature”: “2Lpnvt23H6qHswCNPmwCCUSas7YNP[…]jV1dC9qdNPR4zDqsCuBX”

}

รายการเช่นนั้นมี CID ของตัวเองและเผยแพร่เป็นวัตถุ IPFS PB-DAG¹⁰ ไปยังหัวข้อ /solcial/content HyparView ซ้อนทับ รายการนี้เชื่อมโยงกับรายการก่อนหน้าและเนื้อหาเพิ่มเติมโดยการค้นหา CID ที่เชื่อมโยงซ้ำ ๆ ผู้ใช้สามารถรับประวัติบัญชีและเนื้อหาทั้งหมดได้

ออบเจ็กต์นี้ได้รับการตรวจสอบก่อนโดยเพียร์ผู้รับใดๆ หากลายเซ็นของเนื้อหาตรงกับคีย์สาธารณะของผู้เขียน ในกรณีที่การตรวจสอบลายเซ็นล้มเหลว ผู้ส่งจะถูกแบนถาวรจากโหนดปัจจุบันเนื่องจากละเมิดโปรโตคอล การตรวจสอบลายเซ็นที่ประสบความสำเร็จจะเผยแพร่เนื้อหาไปยังเพื่อนคนอื่นๆ ทั้งหมดที่สนใจเนื้อหาที่เขียนโดยบัญชีนี้

เมื่อเพียร์ได้รับ CID ดังกล่าว จะถูกเพิ่มลงในบันทึกการดำเนินงานของผู้เขียน ผลรวมของการดำเนินการทั้งหมดที่ดำเนินการโดยผู้เขียนถือเป็นสถานะปัจจุบันของโปรไฟล์

โดยค่าเริ่มต้น แต่ละโหนดจะปักหมุดและเริ่มต้นเนื้อหาในบัญชีของตนเองและเนื้อหาเพื่อน มีเพียร์พิเศษที่เรากำลังสร้างโดยเป็นส่วนหนึ่งของโครงสร้างพื้นฐานของเราซึ่งเราเรียกโหนดบีคอนและพวกมันก็เหมือนกับเพียร์ผู้ใช้ทั่วไป ยกเว้นว่าพวกเขาสนใจในเนื้อหาของทุกคนและทำหน้าที่เป็นบริการปักหมุด IPFS เฉพาะโซเชียลสำหรับเนื้อหาทั้งหมด ในกรณีที่ seeders ปัจจุบันทั้งหมดออฟไลน์ คิดว่าเป็นโหนดของทุกคน เครือข่ายจะสามารถทำงานได้โดยไม่ต้องมีก็ได้ แต่จะมีความใงานของเนื้อหาเพิ่มเติมเสมอ

การเข้าถึงการอ่าน

ทุกคนบนโอเวอร์เลย์ Solcial p2p สามารถสืบค้น ดาวน์โหลด และจัดเตรียมเนื้อหาของผู้ใช้โดยกระจายข้อความ IWANT และ IHAVE Bitswap ไปยังหัวข้อ /solcial/content ด้วย CID ของดัชนีรูทระดับบนสุดของบัญชี จากนั้นจึงขอ CID ที่เชื่อมโยงทั้งหมดซ้ำๆ

การซิงค์เริ่มต้นของบัญชีหรือการรับรายการล่าสุดของบัญชีทำได้โดยการกระจายข้อความ HEAD ไปยังหัวข้อ /solcial/sync โดยที่เพียร์อื่น ๆ ที่เป็น seeders (รวมถึง beacon nodes) ตอบสนองด้วย CID ของเนื้อหาล่าสุดที่พวกเขาทราบ ของ. การแปลระหว่างตัวจัดการผู้ใช้และกุญแจสาธารณะของผู้ใช้ทำได้โดยการสอบถาม Solana blockchain

ฟิลด์รายการก่อนหน้าสามารถใช้เพื่อแก้ไข HEADs ที่ขัดแย้งกันและตัดสินใจเลือกรายการปัจจุบัน

การเข้าถึงการเขียน

เพื่อให้สามารถเขียนบันทึกบัญชี ผู้ใช้ต้องมีคีย์ส่วนตัวของคู่คีย์ ED25519 ที่สอดคล้องกับรหัสบัญชีของตน การมีคีย์นั้น ผู้ใช้สามารถสร้างลายเซ็นที่ถูกต้องของรายการที่พวกเขากำลังต่อท้ายบันทึกที่จะไม่ถูกปฏิเสธโดยเพียร์อื่น ๆ ในเครือข่าย

สิทธิ์การเข้าถึงเนื้อหา

เนื้อหาบางส่วนที่โพสต์โดยผู้ใช้มีไว้สำหรับกลุ่มผู้รับที่เลือกเท่านั้น เช่น ฟีดการสมัครรับข้อมูลระดับ Tier-1 หรือ Tier-2 โพสต์เหล่านี้ได้รับการเข้ารหัสก่อนโดยใช้คีย์การเข้ารหัส AES-256 แบบสมมาตร แฮชของคีย์นั้นแนบมากับข้อมูลเมตาของเนื้อหาในโพสต์ต้นฉบับ

คีย์จะกระจายไปยังชุดย่อยแบบสุ่มของเพียร์ที่มีสิทธิ์ผ่านช่องสัญญาณที่เข้ารหัส NOISE ที่สร้างขึ้นระหว่างแฮนด์เชค libp2p ผู้เขียนโพสต์อาจเลือกที่จะอนุญาตให้โหนดบีคอนเข้าร่วมในโครงการแลกเปลี่ยนคีย์เพื่อให้กระบวนการนี้อยู่ใกล้ทันทีสำหรับผู้ใช้ทั้งหมด แต่ไม่จำเป็นต้องทำหากเชื่อว่าเนื้อหาของพวกเขามีความละเอียดอ่อนมาก เมื่อผู้ใช้ที่มีสิทธิ์ต้องการถอดรหัสเนื้อหา พวกเขาจะส่งข้อความ GETKEY ไปยังหัวข้อโอเวอร์เลย์ /solcial/keyexchange ด้วยแฮชของคีย์การเข้ารหัส

เพื่อนร่วมงานทุกคนที่อยู่ในความครอบครองของคีย์นั้นที่ออนไลน์จะตรวจสอบคุณสมบัติของเพียร์ในการรับคีย์นั้นโดยสอบถามบล็อคเชนและตรวจสอบว่าผู้ใช้ถือโทเค็นที่จำเป็นสำหรับการเข้าถึงเนื้อหาหรือไม่ หลังจากการตรวจสอบยืนยันสำเร็จแล้ว คีย์จะถูกส่งไปยังเพียร์ที่ร้องขอโดยใช้การเชื่อมต่อ quic/noise โดยตรงที่ข้ามโปรโตคอลการนินทา

รองรับแพลตฟอร์ม

โปรโตคอลเพียร์ทูเพียร์นี้สำหรับเนื้อหาที่ต่อต้านการเซ็นเซอร์มีให้เฉพาะสำหรับเดสก์ท็อปและไคลเอนต์มือถือ และไม่มีให้บริการผ่านอินเทอร์เฟซเว็บ นี่เป็นเพราะข้อจำกัดของเบราว์เซอร์ เบราว์เซอร์ได้รับการออกแบบมาโดยเนื้อแท้ในฐานะผู้บริโภคเนื้อหาที่โฮสต์บนเซิร์ฟเวอร์และรูปแบบการรักษาความปลอดภัยของเบราว์เซอร์นั้นห้ามรับการเชื่อมต่อแบบสุ่มจากเครื่องอื่น

เวอร์ชันของเว็บจะถูกรวมศูนย์เกือบทุกครั้งเนื่องจากวิธีการทำงานของเบราว์เซอร์และอายุการใช้งานของแท็บเบราว์เซอร์นั้นสั้น และเนื้อหาใดๆ ที่สร้างผ่านอินเทอร์เฟซเว็บจะถูกมิเรอร์บน p2p โดยโหนดบีคอน เนื้อหาใดๆ ที่เว็บไคลเอ็นต์ใช้จะเป็นสำเนาของ p2p P2P คือที่มาของความจริง

เทคนิคพื้นฐานถูกนำมาใช้โดยใช้ Rust, libp2p พร้อมการผูกกับ React Native และ Tauri¹¹

[1] Leitao, Joao, José Pereira, and Luis Rodrigues. “HyParView: A membership protocol for reliable gossip-based broadcast.”

[2] https://en.wikipedia.org/wiki/QUIC

[3] https://libp2p.io/

[4] https://www.google.com/intl/en/ipv6/statistics.html

[5] https://docs.libp2p.io/concepts/circuit-relay/

[6] https://datatracker.ietf.org/doc/html/rfc5766

[7] https://docs.libp2p.io/reference/glossary/#multihash

[8] Leitao, Joao, Jose Pereira, and Luis Rodrigues. “Epidemic broadcast trees.2007 26th IEEE International Symposium on Reliable Distributed Systems (SRDS 2007). IEEE, 2007.

[9] https://docs.ipfs.io/concepts/bitswap/

[10] https://github.com/ipld/ipld/blob/master/specs/codecs/dag-pb/spec.md

[11] https://tauri.studio/

เกี่ยวกับ Solcial

Solcial เป็นเครือข่ายโซเชียลแบบกระจายอำนาจที่ให้ผู้ใช้พลังของ web3 โดยอนุญาตให้ผู้คนโต้ตอบกันโดยไม่ต้องกลัวการเซ็นเซอร์ และอนุญาตให้ผู้สร้างเนื้อหาได้รับรางวัลอย่างยุติธรรมตามมูลค่าตลาด

ติดต่อกับ Solcial

Telegram: https://t.me/solcial

Discord: https://discord.gg/solcial

Twitter: https://twitter.com/solcialofficial

Blog: http://blog.solcial.io/

Website: https://solcial.io

Email: [email protected]

Linktree: https://linktr.ee/solcial











You've successfully subscribed to Solcial Blog
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.