Starting up a new reputation systems has a lot of fine tuning and deciding for the initial set of trusted counterparts can be tough. If there was a way to use existing provable data without having a need to get them to a contract without using an oracle it would help to make the "reputation system" itself actually trusted.
I wanted to use onchain data like association of an address with a contract with historical significance or simply a contract that to a certain extend proves a skill or knowledge of the person possessing the key as the initial constrain for the reputation system. Like for instance having a trusted initial set of reputable parties based on their participation on TheDAO, having Piper's Devcon2 token, comming to Blockparty/Kickback event, having a MakerDAO CDP open, etc. OR simply beign around for long enough.
What it does
Generates a Merkle proof of having a used address at a certain block hash (proves the address was "out there" at some point of time. Then verifies this fact on-chain (Solidity) and if the verification passes acknowledges the key-pair as an 'OG'. OG-auth a simple authentication solidity contract which can, for instance, be used for DAO voters.
How I built it
Started on a wrong track by setting up an old geth version with EIP1186 not noticing it was already merged into the latest release.
- Synced a GoerliTestnet node on AWS.
- Tested stuff with web3.py
- Switched to eth-proof (JS lib)
- Used Truffle (and dapp template)
Challenges I ran into
- Syncing ropsten is a pain (switched to Goerli)
- A lot of the codebase is not merged branches -> lot of rollbacks
Accomplishments that I'm proud of
I learned a lot of stuff!
What I learned
Open source is amazing, I'm learning this again and again. Lot of stuff is out there already and just sits in someones repo waiting to be discovered!
- Merkle proofs
- GoerliTestnet rocks
What's next for OG-auth
1) Expanding to more focused proofs - facts/states from individual contracts & proving things from other blockchains as well.
2) Proposing adding a global variable to Solidity enabling reading the latest StateRoot hash