This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.
When it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise. Imagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade. Approximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.
Teritori is a decentralized Operating System for individuals & communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals & organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.
Convinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.
Another important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the b�Proof-of-Conceptb� (b�PoCb�) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.
The Gno Moderation Module is a smart contract (b�realmb�) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.
Imagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this b�space of freedomb� as a b�common spaceb� unlike any application owned by a private company and hosted on centralized infrastructure. With this radical freedom for the user comes a great responsibilityb� to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why web�ve created the b�Gno Moderation Module.b�
The Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.
Once the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.
This on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.
Moderation DAO members have three voting options:
Once the required vote quota has been reached, the contract automatically executes the voted decision.
The Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.
To accomplish this task, we divided our work into five main stages:
Here is an example, with the DAODAO contract ported into Gnolang: Source
package dao_realm import ( "encoding/base64" "std" "strings" "time" dao_core "gno.land/p/demo/daodao/core_v16" dao_interfaces "gno.land/p/demo/daodao/interfaces_v16" proposal_single "gno.land/p/demo/daodao/proposal_single_v16" voting_group "gno.land/p/demo/daodao/voting_group_v17" "gno.land/p/demo/ujson_v5" "gno.land/r/demo/groups_v22" modboards "gno.land/r/demo/modboards_v9" ) var ( daoCore dao_interfaces.IDAOCore mainBoardName = "dao_realm" groupName = mainBoardName + "_voting_group" groupID groups.GroupID ) func init() { modboards.CreateBoard(mainBoardName) votingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule { groupID = groups.CreateGroup(groupName) groups.AddMember(groupID, "g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c", 1, "") groups.AddMember(groupID, "g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv", 1, "") groups.AddMember(groupID, "g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a", 1, "") groups.AddMember(groupID, "g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym", 1, "") groups.AddMember(groupID, std.GetOrigCaller().String(), 1, "") return voting_group.NewVotingGroup(groupID) } proposalModulesFactories := []dao_interfaces.ProposalModuleFactory{ func(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule { tt := proposal_single.Percent(100) // 1% tq := proposal_single.Percent(100) // 1% return proposal_single.NewDAOProposalSingle(core, &proposal_single.DAOProposalSingleOpts{ MaxVotingPeriod: time.Hour * 24 * 42, Threshold: proposal_single.Threshold{ThresholdQuorum: &proposal_single.ThresholdQuorum{ Threshold: proposal_single.PercentageThreshold{Percent: &tt}, Quorum: proposal_single.PercentageThreshold{Percent: &tq}, }}, }) }, } messageHandlersFactories := []dao_interfaces.MessageHandlerFactory{ func(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler { return groups.NewAddMemberHandler() }, func(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler { return groups.NewDeleteMemberHandler() }, func(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler { // TODO: add a router to support multiple proposal modules propMod := core.ProposalModules()[0] return proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle)) }, func(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler { return modboards.NewCreateBoardHandler() }, func(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler { return modboards.NewDeletePostHandler() }, } daoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories) } func Render(path string) string { return "[[board](/r/demo/modboards:" + mainBoardName + ")]\n\n" + daoCore.Render(path) } func VoteJSON(moduleIndex int, proposalID int, voteJSON string) { module := dao_core.GetProposalModule(daoCore, moduleIndex) if !module.Enabled { panic("proposal module is not enabled") } module.Module.VoteJSON(proposalID, voteJSON) } func Execute(moduleIndex int, proposalID int) { module := dao_core.GetProposalModule(daoCore, moduleIndex) if !module.Enabled { panic("proposal module is not enabled") } module.Module.Execute(proposalID) } func ProposeJSON(moduleIndex int, proposalJSON string) { module := dao_core.GetProposalModule(daoCore, moduleIndex) if !module.Enabled { panic("proposal module is not enabled") } module.Module.ProposeJSON(proposalJSON) } func getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string { module := dao_core.GetProposalModule(daoCore, moduleIndex) return module.Module.ProposalsJSON(limit, startAfter, reverse) }
You can find the full report of Teritori Coreb�s journey here.
Documentation:
Packages:
Tutorial:
#gnoland #dao #moderation #teritori
by g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq on 2023-11-10 8:27pm UTC
AdminSetAdminAddr
AdminSetInPause
AdminAddModerator
AdminRemoveModerator
ModAddPost
ModEditPost
ModAddCommenter
ModDelCommenter
ModDelComment
AddComment
Gnoland Space is a community initiative.
Disclaimer