Verify profile with external services #364
Replies: 21 comments 5 replies
-
Currently our problem is that once you verify a Keybase account with multiple social networks, and then publish somewhere your public key, anyone being able to read public key can impersonate you. This doesn't mean that Keybase is doing something wrong. It just tells us that how it's being used is wrong. Cosmos does not verify any association between the address and the verified Keybase, it just tells you "If you copy it here, we're going to get those info to display the picture". The fact that this shouldn't be considered a proper check is also that multiple validators can have the same identity associated to them. To prove this, I've just copied @bragaz validator identity into my validator. To solve this problem, I think that out approach should be similar to what Keybase is doing. What we can do is define multiple services that can be used to verify the user identity (Twitter, Reddit, GitHub, ...). Ideally, any platform that allows for public access of a part of the user material could be supported. For each service, we need to implement a process that allows us to verify the ownership of a profile on that platform for any given user. The easiest thing to do is generating a content that the user should parse into a public space (Gist for GitHub, tweet for Twitter, etc) and then asking the link to that content. This content should also have an expiration time (like 10 mins) after which it is considered invalid. Then, once the user has verified that service, we store the connected account in a unique way. This would make it impossible for other users trying to steal identities to do so. |
Beta Was this translation helpful? Give feedback.
-
Considering that probably most of the future desmos' user will not come from the crypto world this type of verification is a must have and it will be widely used on dApp along side the verification through IBC. |
Beta Was this translation helpful? Give feedback.
-
Getting the validator Keybase pubkey has been proven to be a mistake. I see a lot of people copy and paste cosmos document to create validator and that's Peng Zong's key suffix 🤣. The problem is that it's not possible to verify the owner of the key from the Keybase suffix. The If you see how Solana is doing, they ask the validators to save the Solana id pubkey as a file in the users' Keybase public folder. The CLI would read the signer's address and Keybase username. Then lookup the public folder of the Keybase user and see if that file exist, verify if the tx signer address is the same as the address saved in the file. The same idea can be applied to Gist or Twitter even domain name TXT records. The problem I'm thinking is this can only all be done off chain before the tx is broadcasted. We cannot do the verification on chain as IBC. If we put the verification part on chain then the full nodes will have to query the external services when they process the tx. That would lead to non-deterministic result. If this can't be verified on chain then imposters can still change the codes to bypass the checking and broadcast the tx to be validated. If this is what we can only do, we should accept this way and rely on the client side the do the verification. For example if a profile has Keybase username and Twitter handle attached,the client app need to query those services to verify the identity when they display the profile. |
Beta Was this translation helpful? Give feedback.
-
@kwunyeung Those were the same doubts as mine. In order to find a solution, I've firstly thought about our problems:
A solution I've came up with is by using oracles. What we can do is use the blockchain as a mere communication layer between users that want to get verified, and external actors that can verify the information by connecting to external services. The process I've thought about is something like this:
This would solve all our problems:
I would say that the best way to implement this is to allow for multiple oracles at the same time, and computing the result of the check by an average of all the oracles results. This system would also allow us to introduce another type of user into the system that might act as a pure oracle, earning Desmos through checking data validity. |
Beta Was this translation helpful? Give feedback.
-
@RiccardoM interesting! I like this approach! We then introduce a new actor on the network with a wider spectrum of incentives. We aso emphasize the importance of the decentralized profile on Desmos. |
Beta Was this translation helpful? Give feedback.
-
I was reading on this https://book.keybase.io/guides/proof-integration-guide and I wondered if we need some sort of |
Beta Was this translation helpful? Give feedback.
-
@bragaz Of course we do 😁 The idea is to do exactly what Keybase is doing:
|
Beta Was this translation helpful? Give feedback.
-
So probably what we could do is generating it when a user create his profile. Later the user will get this One question about Oracles: |
Beta Was this translation helpful? Give feedback.
-
@bragaz Actually, I think it's better to generate the different About oracles, I think they should be special accounts. They should have been specified inside the |
Beta Was this translation helpful? Give feedback.
-
@RiccardoM I think that probably having them only inside |
Beta Was this translation helpful? Give feedback.
-
I'm not particularly in favor of this. Having a specific uptime requirement might not be the best choice in our case. Suppose as an example that an oracle only validates Reddit connections. What would happen if no user wants to connect his Reddit profile to Desmos? No validations will be required and such oracle would appear as not validating. Since this could happen with every social media, I would avoid forcing a minimum validation requirement. Instead, we can allow the governance to decide when an oracle should be removed from the set.
Who should "verify" such oracles? In a centralized world there would be a particular entity responsible for this. But this cannot happen inside Desmos, which we hope will be highly decentralized. Instead of verifying oracles, I think a better solution is to leave the space open for anyone who might to do this work. In order to mitigate fake verification results, we can then use a probabilistic approach to it. Suppose that Alice wants to validate her profile, and the output of different oracles is the following:
Then the probability of the profile being valid if 2/3 (~66%) which is high enough to be considered true. Of course this approach works best when a higher number of oracles are present. For this reason, I think we should:
Please let me know what you think about this as well @kwunyeung |
Beta Was this translation helpful? Give feedback.
-
I'm playing around with Band Protocol recently and I think we can share some ideas from them. Band Protocolhttps://docs.bandchain.org/references/technical-spec#d-3-n-system-overview Validators can activate the oracle from their account. From time to time, validators will receive oracle requests from the protocol. If a validator receives that request, the validator needs to report the prices of the tokens. The following is a list of the report transactions of our validator on the latest testnet. This is one of the requests https://guanyu-testnet1.cosmoscan.io/request/18776 You can see that the request requires a few validators to report. It has a minimum report requirement. If it reaches that minimum number of reports, the price report is consider successful. They have built different modules in the protocol but not only the chain. https://github.com/bandprotocol/bandchain There is an Oracle Binary Interface called https://github.com/bandprotocol/bandchain/tree/master/obi The chain runs oracle scripts in WASM to calculate the token prices. Conditions on Desmos
Suggestions
|
Beta Was this translation helpful? Give feedback.
-
@kwunyeung I really love this approach, but I have one question.
Why is this necessary? Once the profile is validated, can't we assume it will for the time being? Why do you think that having an expiration date on the proof is better? |
Beta Was this translation helpful? Give feedback.
-
What if the owner of the external service account has been changed? Requesting the profile owner to validate again is to confirm that the proof is still valid after a period of time. |
Beta Was this translation helpful? Give feedback.
-
Should we then allow users to decide the length of the verification validity allowing them to specify it when the perform the verification? |
Beta Was this translation helpful? Give feedback.
-
@RiccardoM good question. Let's make it a parameter in the module which can be changed by governance proposal. |
Beta Was this translation helpful? Give feedback.
-
@kwunyeung What if we allow each user individually to specify the validity of its verification method? This also might be useful to have different connections with different time validities (eg. Twitter 100 days, Reddit 50 days). Also, some users might want longer times and others might want shorter ones. And thus will provide more freedom to applications as well |
Beta Was this translation helpful? Give feedback.
-
@RiccardoM I am not sure how much benefit will give the users if letting them to choose their own validation period for each network. The validity period is only an indicator to suggest the users should request for validation before a certain day. Even if the validity period not reach, the user can request the oracles to validate the profile every month and the period will be extended. This is similar to requesting a new SSL certificate from the certificate authorities. The certificate will expire on a specific day but you can renew it before the current certificate expire. |
Beta Was this translation helpful? Give feedback.
-
@kwunyeung Althought it might not benefit users directly, I think it might be still useful to have it customazible on a per-user base. Most of the times, accounts will not be created directly by users, but by the application their are using when registering the first time. Since different applications might want different verification validity times (one might want it shorter and another one longer) I think it would be better to have it customizable. We can make it so that it's optional to specify it and the default value is written inside the module params, so that it can be changed by the governance. This way we would have the best of both worlds: customizability if needed and a default value if someone does not care about a custom value. |
Beta Was this translation helpful? Give feedback.
-
Ok! We can have that flexibility. Please go ahead in this direction. |
Beta Was this translation helpful? Give feedback.
-
Today I started thinking again about this discussion, since it might be interesting to implement this feature in the near future. As @kwunyeung mentioned Band, I took a look at their chain code as well as their
As you can see, since Band allows any kind of wasm binary code to be uploaded, it means that validators can perform any kind of task when submitting some data. For this reason, I think it might be extremely interesting to use directly Band as a oracle provider. We could create some data sources there and have Desmos ask for data using IBC. This would allow us to delegate all those activities to them without having to worry about any problem that might be, and only have the returned result. What do you guys think? EDIT |
Beta Was this translation helpful? Give feedback.
-
Feature description
Besides IBC signatures, we need a way to let users to verify if the profile is owned by a public figure. The recent post from
Cosmos Network
on Mooncake raises this issue. And we don't want to see the scam of the recent and the Twitter hack. If a recognizable public figure is making a post on Desmos, a lot of users may follow on what they are speaking and it's possible to fall in traps if the owner of the profile can't identity in another way.Profiles on Desmos should leave as anonymous as the first choice but we should leave an option for the users to choose if they want to expose their real identity and connect to the outside social world. If users choose to use their real identity, then we need a way for other users to verify if they are the owners of the outside social world.
One approach is to request for a secret action being done on other platforms. A way Solana is doing is to ask validators to provide a keybase username. Under the public folder of that username, it stores the public key of the validator identity key. The CLI verify if the key exist in the public folder before broadcasting the update transaction. But this is done on the client side not on chain.
https://github.com/solana-labs/solana/blob/1c498369b571284b74474ba2e7f9f51fc4e099fd/cli/src/validator_info.rs#L271
It should break if the validator remove the username verification and build locally.
Is there anyway that we can do that on-chain which can also connect to other channels? Or we can only rely on the clients to verify the keys when they display the profile?
Beta Was this translation helpful? Give feedback.
All reactions