December 6, 2021
บทนำ
พื้นที่ นับ ทีมขอให้เราตรวจสอบและตรวจสอบชุดสัญญาโดยมีเป้าหมายสุดท้ายเพื่อปรับปรุงสัญญาการกำกับดูแลทั่วไปและให้ความยืดหยุ่นมากขึ้น เราดูโค้ดแล้วเผยแพร่ผลลัพธ์ของเรา
ภาพรวมของระบบ
ระบบอาศัยสัญญาหลักสามฉบับ:
- A
SafeGuard
แม่แบบสัญญา สัญญานี้คือadmin
ของTimelock
สัญญาและเพิ่มชั้นของบทบาทโมดูลาร์เหนือTimelock
การกระทำของ สัญญานี้กำหนดบทบาทหลายอย่างที่แยกความรับผิดชอบและการเข้าถึงสถานะของข้อเสนอ (การเข้าคิว การยกเลิก และการดำเนินการ) - A
SafeGuardFactory
สัญญาปรับใช้ใหม่SafeGuard
และใหม่ที่เกี่ยวข้องTimelock
สัญญา. จากนั้นจะตั้งค่าที่อยู่ล็อคเวลาภายในSafeGuard
ทำสัญญาและจดทะเบียนใหม่SafeGuard
เข้าไปในRegistry
. - A
Registry
ซึ่งมีรายการปรับใช้SafeGuards
ด้วยความสอดคล้องกัน หมายเลขรุ่น.
พื้นที่ SafeGuardFactory
โดยทั่วไปจะวางไข่ a ใหม่ SafeGuard
เมื่อใดก็ตามที่มันถูกเรียก อา SafeGuard
เป็นพันรอบ Timelock
การดำเนินงาน ที่เพิ่มบทบาทที่แตกต่างและแยกจากกันสำหรับแต่ละการกระทำ บทบาทมีโครงสร้างผ่านการใช้ OpenZeppelin's AccessControlEnumerable
สัญญาที่ให้ความยืดหยุ่นและความเข้ากันได้มากขึ้นกับกระเป๋าเงิน multisig และกรณีการใช้งานทางธุรกิจ ซึ่งที่อยู่หลายแห่งสามารถมีบทบาทร่วมกันได้เหมือนกัน
ปรับปรุง: ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร ประชาสัมพันธ์ #10, ทีม Tally ได้ตัดสินใจที่จะลบ Registry
สัญญา. ขณะนี้รายการของการป้องกันที่ปรับใช้ถูกจัดเก็บไว้ภายใน SafeGuardFactory
สัญญาใน safeGuards
ชุดที่นับได้พร้อมกับเวอร์ชันที่เก็บไว้ใน safeGuardVersion
การทำแผนที่
บทบาท
พื้นที่ SafeGuard
สัญญากำหนดบทบาทดังต่อไปนี้:
ปรับปรุง: พื้นที่ CREATOR_ROLE
บทบาทถูกลบออกเพื่อแก้ไขปัญหา L02
ขอบเขต
เราตรวจสอบคำมั่นสัญญา b2c63a9dfc4090be13320d999e7c6c1d842625d3
ของ safeguard
ที่เก็บ ในขอบเขตคือสัญญาอัจฉริยะใน contracts
ไดเร็กทอรี อย่างไรก็ตาม mocks
ไดเร็กทอรีถือว่าอยู่นอกขอบเขต
สมมติฐาน
ระบบไม่ได้หมายถึงการอัพเกรด ดิ Registry
ที่อยู่ถูกตั้งค่า ในตัวสร้าง ของ SafeGuardFactory
และแต่ละ SafeGuard
สามารถมีไฟล์ Timelock
ตั้งเพียงครั้งเดียว. ซึ่งหมายความว่าหากใหม่ Registry
ถูกปรับใช้ใหม่ SafeGuardFactory
ต้องปรับใช้ด้วย ถ้า Timelock
การเปลี่ยนแปลงการดำเนินการ, เก่า SafeGuard
จะล้าสมัยและจะต้องมีการติดตั้งใหม่
นอกจากนี้ ระบบยังต้องอาศัยการนำ a . ไปปฏิบัติอย่างมาก Timelock
สัญญา ซึ่งถือว่าอยู่นอกขอบเขตการตรวจสอบนี้ ทีมงานยังไม่ได้สรุปการดำเนินการของ Timelock
สัญญา. ในขณะที่เขียนรายงานนี้ การใช้งาน timelock ของ Compound ถูกใช้ในโครงการ
Codebase ได้รับการตรวจสอบโดยผู้ตรวจสอบสองคนในช่วงหนึ่งสัปดาห์ และที่นี่เรานำเสนอข้อค้นพบของเรา
ความรุนแรงที่สำคัญ
ไม่
ความรุนแรงสูง
[H01] ETH สามารถล็อคได้ภายใน Timelock
สัญญา
พื้นที่ Tally
เดิมทีทีมงานได้ใช้การนำไปปฏิบัติบนพื้นฐานของ GovernorBravoDelegate
สัญญารวม.
ในระหว่างการตรวจสอบนี้ Tally
ทีมค้นพบ ข้อจำกัด ในผู้ปกครองของ Compound โดยที่ ETH ส่งตรงไปยัง Timelock
ไม่พร้อมใช้งานโดยข้อเสนอด้านการกำกับดูแล และแม้ว่าจะไม่ได้ติดอยู่อย่างถาวร แต่ต้องมีวิธีแก้ปัญหาอย่างละเอียดถี่ถ้วน
ทั้งนี้เนื่องจากการดำเนินการของผู้ว่าราชการจังหวัดต้องการให้แนบมูลค่าทั้งหมดของข้อเสนอเป็น msg.value
โดยบัญชีที่เรียกการดำเนินการ ไม่ได้ใช้ในทางใดทางหนึ่ง Timelock
กองทุน ETH
พื้นที่ ปัญหาเดียวกันถูกระบุในภายหลังใน SafeGuard
การดำเนินงาน และทางทีมงานรับทราบปัญหาและกำลังดำเนินการแก้ไข
ขณะแก้ไขปัญหาให้พิจารณาใช้แนวทาง นำมาใช้โดยห้องสมุด OpenZeppelin สำหรับปัญหาเดียวกัน.
ปรับปรุง: แก้ไขในคอมมิต 7337db227edda83533be586135d96ddac4f5bf29
.
[H02] SafeGuardFactory สามารถแช่แข็งได้
พื้นที่ Registry
สัญญามีวัตถุประสงค์เพื่อติดตามทั้งหมด SafeGuards
that the SafeGuardFactory
ผลิต. มันมีภายนอก register
ฟังก์ชัน ที่ใช้เพื่อการนี้
ในขณะเดียวกัน SafeGuardFactory
ในตัวสร้างของมัน การกำหนดของท้องถิ่น registry
ค่าเป็นค่าอินพุต. ไม่มีความเป็นไปได้ที่จะเปลี่ยนค่าของ registry
ตัวแปรและด้วยเหตุนี้หากเป็นใหม่ Registry
ได้รับการปรับใช้โรงงานใหม่จะต้องถูกปรับใช้ด้วย
พื้นที่ SafeGuardFactory
มี createSafeGuard
ฟังก์ชัน, รับผิดชอบก่อน ปรับใช้ใหม่ SafeGuard
แล้ว ใหม่ Timelock
ด้วยที่อยู่ของ SafeGuard
as admin
, แล้วตั้งค่า timelock
ตัวแปรของ SafeGuard
สัญญาและในที่สุด การลงทะเบียน SafeGuard
ในรีจิสทรี.
ประเด็นคือทุกสายที่โทรไป createSafeGuard
สามารถถูกบังคับให้ล้มเหลวโดยผู้โจมตีที่สามารถลงทะเบียนที่อยู่ที่กำหนดของใหม่ได้โดยตรง SafeGuard
ก่อนที่จะมีการสร้าง เมื่อไหร่ก็ตามที่ทำสัญญา สร้าง new
ตัวอย่าง, nonce เพิ่มขึ้น และที่อยู่ของตำแหน่งที่จะปรับใช้อินสแตนซ์ใหม่ของสัญญาสามารถกำหนดโดยที่อยู่ของสัญญาเดิมและ nonce ของสัญญา ดังนั้น ผู้โจมตีสามารถคำนวณล่วงหน้าของที่อยู่จำนวนมากที่ new SafeGuards
จะถูกนำไปใช้และลงทะเบียนที่อยู่เหล่านั้นใน Registry
โดยเรียก register
การทำงาน. ซึ่งจะส่งผลให้มีการเรียกไปยัง createSafeGuard
ไปยัง คืนกลับ ตั้งแต่ Registry
มีที่อยู่อยู่แล้ว
เพื่อหลีกเลี่ยงไม่ให้บุคคลภายนอกเรียกตัว Register
สัญญา พิจารณาจำกัดการเข้าถึง register
ฟังก์ชั่นรับสายโดย .เท่านั้น SafeGuardFactory
.
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10. ทีม Tally ได้ลบ Registry
สัญญา.
ความรุนแรงปานกลาง
ไม่
ความรุนแรงต่ำ
[L01] แสดงความคิดเห็นโค้ด
พื้นที่ Registry
สัญญารวมถึง แสดงความคิดเห็นออกบรรทัดของรหัส. เพื่อปรับปรุงความสามารถในการอ่าน ให้ลองลบออกจาก codebase
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10 และมุ่งมั่น 7fd27df16fc879d990d36a167a0b6e719e578558
.
[L02] ผู้ดูแลระบบของ SafeGuard สามารถกำหนดบทบาทของผู้สร้างให้กับที่อยู่ใดก็ได้
พื้นที่ SafeGuard
สัญญากำหนดบทบาทของa CREATOR_ROLE
ซึ่งตามชื่อที่แนะนำนั้นถูกกำหนดให้เป็นผู้สร้างการป้องกัน
อย่างไรก็ตาม โดยการเรียก grantRole
ฟังก์ชันของ AccessControlEnumerable
สัญญา ในไลบรารีสัญญา OpenZeppelin ผู้ดูแลระบบสามารถมอบบทบาทนี้ให้กับที่อยู่ใดก็ได้ ซึ่งอาจทำให้เกิดความสับสนได้เนื่องจาก ผู้สร้าง SafeGuard
สามารถเป็นได้เพียง SafeGuardFactory
.
ตลอด codebase บทบาทนี้ถูกใช้เพื่อจำกัดผู้ใช้จากการโต้ตอบกับ .เท่านั้น setTimelock
ฟังก์ชัน ของ SafeGuard
สัญญา. โดยการออกแบบระบบทำให้มั่นใจได้ว่า setTimelock
ฟังก์ชัน เรียกได้เพียงครั้งเดียวจาก ภายใน SafeGuardFactory
สัญญา.
พิจารณาลบ CREATOR_ROLE
บทบาทจาก SafeGuard
สัญญาและการใช้ onlyOwner
เปลี่ยนแปลง ใน setTimelock
ฟังก์ชัน
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10.
[L03] คำจำกัดความและการใช้งานอินเทอร์เฟซไม่ถูกต้อง
พื้นที่ ISafeGuard
อินเทอร์เฟซไม่ได้กำหนด queueTransactionWithDescription
ฟังก์ชัน ดำเนินการใน SafeGuard
สัญญา และในขณะเดียวกันก็กำหนด __abdicate, __queueSetTimelockPendingAdmin และ __executeSetTimelockPendingAdmin ฟังก์ชั่นแต่ไม่ได้ใช้งาน
เพื่อปรับปรุงความถูกต้องและความสอดคล้องใน codebase ให้พิจารณาการปรับโครงสร้าง ISafeGuard
อินเทอร์เฟซเพื่อให้ตรงกับ SafeGuard
การดำเนินงาน
ปรับปรุง: แก้ไขในคอมมิต 7fd27df16fc879d990d36a167a0b6e719e578558
.
[L04] ไม่มี docstrings
สัญญาและหน้าที่บางอย่างในฐานรหัสไม่มีเอกสารประกอบ ตัวอย่างเช่น, ฟังก์ชั่นบางอย่าง ใน SafeGuard
สัญญา.
นอกจากนี้ เอกสารบางฉบับใช้ภาษาที่ไม่เป็นทางการ เช่น one ดังกล่าวข้างต้น setTimelock
ฟังก์ชั่นใน SafeGuard
สัญญา.
สิ่งนี้ขัดขวางความเข้าใจของผู้ตรวจสอบเกี่ยวกับความตั้งใจของโค้ด ซึ่งเป็นพื้นฐานในการประเมินอย่างถูกต้อง ไม่เพียงแต่ความปลอดภัยเท่านั้น แต่ยังรวมถึงความถูกต้องด้วย นอกจากนี้ เอกสารประกอบยังปรับปรุงความสามารถในการอ่านและบำรุงรักษาง่ายอีกด้วย พวกเขาควรอธิบายอย่างชัดเจนถึงวัตถุประสงค์หรือความตั้งใจของฟังก์ชัน สถานการณ์ที่อาจล้มเหลว บทบาทที่อนุญาตให้เรียกใช้ ค่าที่ส่งคืน และเหตุการณ์ที่ปล่อยออกมา
พิจารณาการจัดทำเอกสารการทำงานทั้งหมด (และพารามิเตอร์) อย่างละเอียด ซึ่งเป็นส่วนหนึ่งของ API สาธารณะของสัญญา ฟังก์ชันที่ใช้ฟังก์ชันที่ละเอียดอ่อน แม้ว่าจะไม่ใช่แบบสาธารณะ ก็ควรมีการจัดทำเป็นเอกสารไว้อย่างชัดเจนเช่นกัน เมื่อเขียน docstrings ให้พิจารณาปฏิบัติตาม รูปแบบข้อกำหนดทางธรรมชาติของ Ethereum (แนทสเปก).
ปรับปรุง: แก้ไขบางส่วนใน ประชาสัมพันธ์ #10. มีการเพิ่ม docstrings ที่เหมาะสมในฟังก์ชันต่างๆ ทั่วทั้งฐานโค้ด อย่างไรก็ตาม นอกเหนือจากการเปลี่ยนแปลงในปัจจุบัน ให้พิจารณาทำการเปลี่ยนแปลงต่อไปนี้:
- เพิ่ม
description
เป็น@param
ในเอกสารประกอบด้านบนqueueTransactionWithDescription
ฟังก์ชัน - เพิ่ม
@param
ใน เอกสาร ดังกล่าวข้างต้นcreateSafeGuard
ฟังก์ชันมาSafeGuardFactory
สัญญา - เพิ่ม
@return
ใน docstrings เหนือฟังก์ชันในSafeGuardFactory
สัญญา.
[L05] รหัสไร้ประโยชน์หรือซ้ำซ้อน
มีบางตำแหน่งในฐานรหัสที่โค้ดซ้ำหรือไม่จำเป็น ตัวอย่างบางส่วน ได้แก่ :
- บรรทัดที่ 29-32 ของ
Registry
สัญญานั้นไร้ประโยชน์เพราะว่า_add
ฟังก์ชันของEnumerableSet
สัญญา ได้ดำเนินการตรวจสอบเหล่านี้แล้ว เทียบกับค่าที่ตั้งไว้แล้ว - บรรทัดที่ 62, 67, 73 และ 78 ของ
SafeGuard
สัญญาทั้งหมดทำซ้ำการดำเนินการที่แน่นอนเหมือนกัน พิจารณาการห่อหุ้มไว้ในฟังก์ชันภายในเพื่อหลีกเลี่ยงการทำซ้ำโค้ด - บรรทัดที่ 62-63 และ 67-68 of
SafeGuard
มีการทำซ้ำ พิจารณาห่อหุ้มไว้ในฟังก์ชันภายในเดียว - การใช้งานของ
gasleft
เพื่อระบุปริมาณก๊าซที่ควรจะถูกส่งต่อในการเรียกใช้ฟังก์ชันexecuteTransaction
ไม่จำเป็น ทั้งนี้เนื่องจาก ณ จุดดำเนินการนั้น ก๊าซทั้งหมดที่เหลือจะถูกใช้เพื่อดำเนินการประหารชีวิตต่อไป หากไม่ใช่เพื่อความชัดเจน ให้พิจารณาลบgas
พารามิเตอร์จากการโทร
ลองใช้การแก้ไขที่แนะนำเพื่อสร้างโค้ดที่สะอาดขึ้น และปรับปรุงความสอดคล้องและความเป็นโมดูลบนฐานโค้ด
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10 และมุ่งมั่น 7fd27df16fc879d990d36a167a0b6e719e578558
.
หมายเหตุและข้อมูลเพิ่มเติม
[N01] รูปแบบที่ไม่สอดคล้องกัน
มีบางตำแหน่งในฐานโค้ด ซึ่งความแตกต่างของรูปแบบส่งผลต่อความสามารถในการอ่าน ทำให้เข้าใจโค้ดได้ยากขึ้น ตัวอย่างบางส่วน ได้แก่ :
- พื้นที่
Registry
สัญญาใช้รูปแบบที่แตกต่างกันสำหรับเอกสารในสัญญาทั้งหมด - พื้นที่
SafeGuard
สัญญาจะปล่อยเหตุการณ์เมื่อqueueTransactionWithDescription
ถูกเรียก แต่ไม่มีเหตุการณ์เกิดขึ้นในฟังก์ชันอื่นที่เกี่ยวข้องกับธุรกรรม - ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร
SafeGuard
สัญญาบางครั้ง ความคุ้มค่า ถูกใช้เป็นพารามิเตอร์ที่มีชื่อและบางครั้ง _ค่า ถูกนำมาใช้.
การพิจารณาถึงคุณค่าของรูปแบบการเขียนโค้ดที่สอดคล้องกันจะเพิ่มความสามารถในการอ่านของโปรเจ็กต์ ให้พิจารณาบังคับใช้รูปแบบการเข้ารหัสมาตรฐานด้วยความช่วยเหลือของเครื่องมือ linter เช่น Solhint
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10 และมุ่งมั่น 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N02] ไม่มีใบอนุญาต
สัญญาต่อไปนี้ภายในฐานรหัสไม่มีตัวระบุสิทธิ์การใช้งาน SPDX
หากต้องการปิดเสียงคำเตือนของคอมไพเลอร์และเพิ่มความสอดคล้องในฐานรหัส ให้พิจารณาเพิ่มตัวระบุใบอนุญาต ขณะทำก็ให้นึกถึง spdx.dev แนวทาง
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10 และมุ่งมั่น 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N03] การพึ่งพาสัญญา OpenZeppelin ไม่ถูกตรึง
เพื่อป้องกันพฤติกรรมที่ไม่คาดคิดในกรณีที่มีการเปลี่ยนแปลงการแตกหักในการอัพเดทในอนาคตของ ห้องสมุด OpenZeppelin Contractsให้พิจารณาตรึงเวอร์ชันของการพึ่งพานี้ใน package.json ไฟล์
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10.
[N04] ไม่ได้ตรึงเวอร์ชันคอมไพเลอร์ Solidity ไว้
ตลอดทั้งฐานโค้ด ให้ลองตรึงเวอร์ชันของ คอมไพเลอร์ Solidity เป็นเวอร์ชันเสถียรล่าสุด สิ่งนี้จะช่วยป้องกันการแนะนำจุดบกพร่องที่ไม่คาดคิดอันเนื่องมาจากรุ่นในอนาคตที่เข้ากันไม่ได้ ในการเลือกเวอร์ชันเฉพาะ นักพัฒนาควรพิจารณาทั้งคุณสมบัติของคอมไพเลอร์ที่โครงการต้องการและ รายการข้อบกพร่องที่รู้จัก เกี่ยวข้องกับคอมไพเลอร์ Solidity แต่ละเวอร์ชัน
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10.
[N05] พิมพ์ผิด
ในกรณีต่างๆ ตลอดทั้งฐานรหัส คำว่า role
สะกดผิดเป็น rol
. ตัวอย่างหนึ่งคือใน docstring ภายใน constructor
ของ SafeGuard
สัญญา.
ลองแก้ไขข้อผิดพลาดเหล่านี้เพื่อปรับปรุงความสามารถในการอ่านโค้ด
ปรับปรุง: แก้ไขบางส่วนใน ประชาสัมพันธ์ #10. ในขณะที่การสะกดของ role
ได้รับการแก้ไขแล้ว ความคิดเห็น "กำหนดบทบาทผู้ดูแลระบบเป็นที่อยู่ผู้ดูแลระบบที่กำหนดไว้" ควรเป็น "กำหนดบทบาทผู้ดูแลระบบเป็นที่อยู่ผู้ดูแลระบบที่กำหนดไว้" นอกจากนี้ “execute” ยังสะกดผิดใน SafeGuard
สัญญาใน บรรทัด 69, บรรทัด 82, บรรทัด 96 และ บรรทัด 110 และ “พร้อม” สะกดผิดใน บรรทัด 70, บรรทัด 83, บรรทัด 97, บรรทัด 111. นอกจากนี้ ให้พิจารณาแทนที่คำที่ไม่เป็นทางการ เช่น "จะ" in SafeGuard
สัญญากับทางเลือกที่เป็นทางการเช่น "ไป"
[N06] ประกาศ uint เป็น uint256
มีหลายเหตุการณ์ในฐานรหัสที่มีการประกาศตัวแปรของ uint
ชนิดข้อมูลแทน uint256
. ตัวอย่างเช่น eta
ตัวแปรใน QueueTransactionWithDescription
เหตุการณ์ ของ SafeGuard
สัญญา.
เพื่อสนับสนุนความชัดเจน ทุกกรณีของ uint
ควรประกาศเป็น uint256
.
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10 และมุ่งมั่น 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N07] การนำเข้าที่ไม่ได้ใช้
พื้นที่ SafeGuard
สัญญานำเข้า console
สัญญาแต่ไม่เคยใช้
เพื่อปรับปรุงความสามารถในการอ่านโค้ด ให้พิจารณาลบการนำเข้าที่ไม่ได้ใช้
ปรับปรุง: แก้ไขใน ประชาสัมพันธ์ #10.
สรุป
พบช่องโหว่ระดับสูงและจุดอ่อนอื่น ๆ อีกหลายแห่งและข้อเสนอแนะและการแก้ไขได้รับการแนะนำ
- &
- เข้า
- ลงชื่อเข้าใช้
- ข้าม
- การกระทำ
- การปฏิบัติ
- เพิ่มเติม
- ที่อยู่
- ผู้ดูแลระบบ
- ทั้งหมด
- แล้ว
- แม้ว่า
- API
- เข้าใกล้
- รอบ
- การตรวจสอบบัญชี
- เป็นพื้น
- กำลัง
- เป็นโรคจิต
- ธุรกิจ
- โทรศัพท์
- กรณี
- ก่อให้เกิด
- เปลี่ยนแปลง
- รับผิดชอบ
- รหัส
- การเข้ารหัส
- ร่วมกัน
- สารประกอบ
- ความสับสน
- การพิจารณา
- มี
- ต่อ
- สัญญา
- สัญญา
- ได้
- ผู้สร้าง
- ปัจจุบัน
- ข้อมูล
- การซื้อขาย
- ออกแบบ
- นักพัฒนา
- ต่าง
- ค้นพบ
- ทำอย่างละเอียด
- ETH
- เหตุการณ์
- เหตุการณ์
- ตัวอย่าง
- โรงงาน
- คุณสมบัติ
- ในที่สุด
- ชื่อจริง
- แก้ไขปัญหา
- ความยืดหยุ่น
- พบ
- ฟังก์ชัน
- เงิน
- อนาคต
- GAS
- ให้
- เป้าหมาย
- การกำกับดูแล
- ผู้ว่าราชการ
- แนวทาง
- มี
- ช่วย
- โปรดคลิกที่นี่เพื่ออ่านรายละเอียดเพิ่มเติม
- จุดสูง
- สรุป ความน่าเชื่อถือของ Olymp Trade?
- HTTPS
- การดำเนินการ
- เพิ่ม
- เพิ่มขึ้น
- อินเตอร์เฟซ
- IT
- ที่รู้จักกัน
- ภาษา
- ล่าสุด
- ห้องสมุด
- License
- Line
- รายการ
- ในประเทศ
- ล็อค
- มอง
- การทำ
- การจับคู่
- โมดูลาร์
- มัลติซิก
- อื่นๆ
- นำเสนอ
- กระบวนการ
- โครงการ
- ข้อเสนอ
- สาธารณะ
- ประกาศ
- ทะเบียน
- สัมพันธ์
- รายงาน
- กรุ
- ผลสอบ
- ทบทวน
- ความปลอดภัย
- ชุด
- การตั้งค่า
- ที่ใช้ร่วมกัน
- สมาร์ท
- สัญญาสมาร์ท
- ความแข็งแรง
- สถานะ
- สไตล์
- ระบบ
- ตลอด
- ตลอด
- เวลา
- เครื่องมือ
- ลู่
- การทำธุรกรรม
- การปรับปรุง
- us
- ผู้ใช้
- ความคุ้มค่า
- ช่องโหว่
- กระเป๋าสตางค์
- สัปดาห์
- WHO
- ภายใน
- คำ
- การเขียน