Last active
January 2, 2019 21:36
-
-
Save burdettadam/06938618f94c93f175dfdbcc8677777b to your computer and use it in GitHub Desktop.
modified faber script for interacting with connect.me.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import asyncio | |
import json | |
import random | |
from ctypes import cdll | |
from time import sleep | |
import logging | |
import pyqrcode | |
from vcx.api.vcx_init import vcx_init_with_config, vcx_init | |
from vcx.api.connection import Connection | |
from vcx.api.credential_def import CredentialDef | |
from vcx.api.issuer_credential import IssuerCredential | |
from vcx.api.proof import Proof | |
from vcx.api.schema import Schema | |
from vcx.api.utils import vcx_agent_provision | |
from vcx.api.vcx_init import vcx_init_with_config | |
from vcx.state import State, ProofState | |
# logging.basicConfig(level=logging.DEBUG) uncomment to get logs | |
# 'agency_url': URL of the agency | |
# 'agency_did': public DID of the agency | |
# 'agency_verkey': public verkey of the agency | |
# 'wallet_name': name for newly created encrypted wallet | |
# 'wallet_key': encryption key for encoding wallet | |
# 'payment_method': method that will be used for payments | |
provisionConfig = { | |
#'agency_url':'http://localhost:8080', | |
'agency_url':'http://18.225.10.192:30800', | |
'agency_did':'VsKV7grR1BUE29mG2Fm2kX', | |
'agency_verkey':'Hezce2UWMZ3wUhVkh2LfKSs8nDzWwzs2Win7EzNN3YaR', | |
'wallet_name':'sovrin_wallet', | |
'wallet_key':'123', | |
'enterprise_seed':'000000000000000000000000Trustee1', | |
'institution_name':'Sovrin', | |
#'institution_logo_url': screensaver("adventure time")["original"]["url"], | |
'payment_method':'sov' | |
} | |
cred_attrs = { | |
'name': 'Adam', | |
'date': '12/20/2018', | |
'position': '1', | |
'cup': 'Sovrin turkey, table tennis, turnament' | |
} | |
async def main(): | |
libsovtoken = cdll.LoadLibrary('/c/Users/burdettadam/Documents/GitHub/libsovtoken/libsovtoken/target/debug/libsovtoken.so') | |
libsovtoken.sovtoken_init() | |
# clean up code | |
'''print("#1 Provision an agent and wallet, get back configuration details") | |
config = await vcx_agent_provision(json.dumps(provisionConfig)) | |
config = json.loads(config) | |
# Set some additional configuration options specific to faber | |
config['institution_name'] = provisionConfig["institution_name"] | |
config['institution_logo_url'] = "https://pbs.twimg.com/profile_images/1034794321751330816/nBXwd5Wg_400x400.jpg" #screensaver("adventure time")["original"]["url"] | |
config['genesis_path'] = 'docker.txn' | |
config['payment_method'] = provisionConfig['payment_method'] | |
f = open("faberVcxConfig.json", "w") | |
f.write(json.dumps(config)) | |
print("#2 Initialize libvcx with new configuration") | |
await vcx_init_with_config(json.dumps(config)) | |
''' | |
print("#2 Initialize libvcx with new configuration") | |
with open("faberVcxConfig.json") as f: | |
config = json.load(f) | |
await vcx_init("faberVcxConfig.json") | |
print("#3 Create a new schema on the ledger") | |
version = format("%d.%d.%d" % (random.randint(1, 101), random.randint(1, 101), random.randint(1, 101))) | |
schema = await Schema.create('schema_uuid', 'degree schema', version, [*cred_attrs.keys()], 0) | |
schema_id = await schema.get_schema_id() | |
print("#4 Create a new credential definition on the ledger") | |
cred_def = await CredentialDef.create('credef_uuid', 'degree', schema_id, 0) | |
cred_def_id = await cred_def.get_cred_def_id() | |
print("#5 Create a connection and write QR code invite") | |
connection_to_alice = await Connection.create('alice') | |
await connection_to_alice.connect(None) | |
await connection_to_alice.update_state() | |
details = await connection_to_alice.invite_details(False) | |
offer = convertInvite(details) | |
offer["s"]["n"] = config["institution_name"] | |
offer["t"] = cred_attrs["name"] | |
offer["s"]["l"] = config['institution_logo_url'] | |
pyqrcode.create(json.dumps(offer)).png('qr-code-connection-offer.png', scale=1, module_color=[0, 0, 0, 128], background=[0xff, 0xff, 0xcc]) | |
print("#6 Poll agency and wait for connection invitation to be accepted (scan QR code now)") | |
connection_state = await connection_to_alice.get_state() | |
while connection_state != State.Accepted: | |
sleep(10) | |
await connection_to_alice.update_state() | |
connection_state = await connection_to_alice.get_state() | |
print("#12 Create an IssuerCredential object using the schema and credential definition") | |
credential = await IssuerCredential.create('alice_degree', cred_attrs, cred_def_id, 'cred', '1000000') | |
print("#13 Issue credential offer over connection") | |
await credential.send_offer(connection_to_alice) | |
await credential.update_state() | |
print("#14 Poll agency and wait for a credential request") | |
credential_state = await credential.get_state() | |
while credential_state != State.RequestReceived: | |
sleep(10) | |
await credential.update_state() | |
credential_state = await credential.get_state() | |
print("#17 Issue credential ") | |
await credential.send_credential(connection_to_alice) | |
print("#18 Wait for credential to be accepted") | |
await credential.update_state() | |
credential_state = await credential.get_state() | |
while credential_state != State.Accepted: | |
sleep(10) | |
await credential.update_state() | |
credential_state = await credential.get_state() | |
proof_attrs = proof_request(cred_attrs,config['institution_did']) | |
print("#19 Create a Proof object") | |
proof = await Proof.create('proof_uuid', 'Sovrin Proof Request', proof_attrs) | |
print("#20 Request proof of degree from alice") | |
await proof.request_proof(connection_to_alice) | |
print("#21 Poll agency and wait for alice to provide proof") | |
proof_state = await proof.get_state() | |
while proof_state != State.Accepted: | |
sleep(10) | |
await proof.update_state() | |
proof_state = await proof.get_state() | |
print("#27 Process the proof provided by alice") | |
await proof.get_proof(connection_to_alice) | |
print("#28 Check if proof is valid") | |
if proof.proof_state == ProofState.Verified: | |
print("proof is verified!!") | |
else: | |
print("could not verify proof :(") | |
def convertInvite(invite): | |
return{ "id": invite["connReqId"], | |
"s" :{"d" :invite["senderDetail"]["DID"], | |
"dp":{"d":invite["senderDetail"]["agentKeyDlgProof"]["agentDID"], | |
"k":invite["senderDetail"]["agentKeyDlgProof"]["agentDelegatedKey"], | |
"s":invite["senderDetail"]["agentKeyDlgProof"]["signature"] | |
}, | |
"l" :invite["senderDetail"]["logoUrl"], | |
"n" :invite["senderDetail"]["name"], | |
"v" :invite["senderDetail"]["verKey"] | |
}, | |
"sa":{"d":invite["senderAgencyDetail"]["DID"], | |
"e":invite["senderAgencyDetail"]["endpoint"], | |
"v":invite["senderAgencyDetail"]["verKey"] | |
}, | |
"sc":invite["statusCode"], | |
"sm":invite["statusMsg"], | |
"t" :invite["targetName"] | |
} | |
def proof_request(cred,institution_did): | |
proof_request = [] | |
for key,val in cred.items(): | |
proof_request.append({'name': key,'restrictions': [{'issuer_did':institution_did}]}) | |
#print(json.dumps(proof_request)) | |
return proof_request | |
if __name__ == '__main__': | |
loop = asyncio.get_event_loop() | |
loop.run_until_complete(main()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment