Best practice for manual update of profile.json?

#1

Dear Blockstackers - please excuse this perhaps rather stupid question, but today is just day 3 of my blockstack life :heart_eyes:.

I created my profile using versions of Blockstack Core and Browser tagged with latest on Quay. That must have been probably version v0.14.x, my initial client.ini had an entry

[blockstack-client]
client_version = 0.14.5.1

Using the Browser UI I filled out the YouTube section and accidentally misspelled my username. Unfortunately, I only noticed that one day later on [https://explorer.blockstack.org/name/stulle.id].

I now switched to version v0.17.1 of the software, where the YouTube section has been removed from the profile editor UI:

The question that now comes to me is: What is best practice for manual changes of the profile, that in my case is stored as ~\Dropbox\Apps\Blockstack\stulle.id\profile.json? How do I sign the file using the Blockstack CLI?

Thank you in advance.

#2

Hey @relianz,

Glad to hear you’re upgraded to the v0.17.x branch! You can use the blockstack sign_profile command to sign a JSON blob with your profile information. Your API daemon must be running first, however, since the sign_profile command requires access to your private keys.

Here’s an example trace with my profile:

$ cat /tmp/judecn.id.json
{                                                                                                                                                                                                                                                                               
  "@type": "Person", 
  "account": [
      {
          "@type": "Account", 
          "identifier": "judecnelson", 
          "proofType": "http", 
          "service": "twitter"
      }, 
      {
          "@type": "Account", 
          "identifier": "sunspider", 
          "proofType": "http", 
          "service": "facebook"
      }, 
      {
          "@type": "Account", 
          "identifier": "jcnelson", 
          "proofType": "http", 
          "service": "github"
      }, 
      {
          "@type": "Account", 
          "identifier": "17zf596xPvV8Z8ThbWHZHYQZEURSwebsKE", 
          "role": "payment", 
          "service": "bitcoin"
      }
  ], 
  "address": {
      "@type": "PostalAddress", 
      "addressLocality": "Princeton University"
  }, 
  "description": "Blockstack Engineer", 
  "image": [
      {
          "@type": "ImageObject", 
          "contentUrl": "https://s3.amazonaws.com/kd4/judecn", 
          "name": "avatar"
      }, 
      {
          "@type": "ImageObject", 
          "contentUrl": "https://s3.amazonaws.com/97p/gQZ.jpg", 
          "name": "cover"
      }
  ], 
  "name": "Jude Nelson", 
  "website": [
      {
          "@type": "WebSite", 
          "url": "http://www.cs.princeton.edu/~jcnelson"
      }
  ]
}
$ blockstack api start  # if it's not already running
Enter wallet password:
{                                                                                                                                                                                                                                                                               
    "status": true
}
$ blockstack sign_profile /tmp/judecn.id.json
[{"encrypted": false, "parentPublicKey": "0296d988e3a31ef5ea31dff068c94c52b7d8213e8aa00bedd1ca7247df4fe7413f", "token": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJpc3N1ZWRBdCI6IjIwMTctMTAtMTVUMTM6MDM6NTkuNTM5MTE4IiwiY2xhaW0iOnsid2Vic2l0ZSI6W3sidXJsIjoiaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35qY25lbHNvbiIsIkB0eXBlIjoiV2ViU2l0ZSJ9XSwiYWNjb3VudCI6W3siaWRlbnRpZmllciI6Imp1ZGVjbmVsc29uIiwiQHR5cGUiOiJBY2NvdW50Iiwic2VydmljZSI6InR3aXR0ZXIiLCJwcm9vZlR5cGUiOiJodHRwIn0seyJpZGVudGlmaWVyIjoic3Vuc3BpZGVyIiwiQHR5cGUiOiJBY2NvdW50Iiwic2VydmljZSI6ImZhY2Vib29rIiwicHJvb2ZUeXBlIjoiaHR0cCJ9LHsiaWRlbnRpZmllciI6ImpjbmVsc29uIiwiQHR5cGUiOiJBY2NvdW50Iiwic2VydmljZSI6ImdpdGh1YiIsInByb29mVHlwZSI6Imh0dHAifSx7ImlkZW50aWZpZXIiOiIxN3pmNTk2eFB2VjhaOFRoYldIWkhZUVpFVVJTd2Vic0tFIiwicm9sZSI6InBheW1lbnQiLCJAdHlwZSI6IkFjY291bnQiLCJzZXJ2aWNlIjoiYml0Y29pbiJ9XSwibmFtZSI6Ikp1ZGUgTmVsc29uIiwiaW1hZ2UiOlt7ImNvbnRlbnRVcmwiOiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20va2Q0L2p1ZGVjbiIsIkB0eXBlIjoiSW1hZ2VPYmplY3QiLCJuYW1lIjoiYXZhdGFyIn0seyJjb250ZW50VXJsIjoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLzk3cC9nUVouanBnIiwiQHR5cGUiOiJJbWFnZU9iamVjdCIsIm5hbWUiOiJjb3ZlciJ9XSwiYWRkcmVzcyI6eyJhZGRyZXNzTG9jYWxpdHkiOiJQcmluY2V0b24gVW5pdmVyc2l0eSIsIkB0eXBlIjoiUG9zdGFsQWRkcmVzcyJ9LCJAdHlwZSI6IlBlcnNvbiIsImRlc2NyaXB0aW9uIjoiQmxvY2tzdGFjayBFbmdpbmVlciJ9LCJleHBpcmVzQXQiOiIyMDE4LTEwLTE1VDEzOjAzOjU5LjUzOTExOCIsImlzc3VlciI6eyJwdWJsaWNLZXkiOiIwMjk2ZDk4OGUzYTMxZWY1ZWEzMWRmZjA2OGM5NGM1MmI3ZDgyMTNlOGFhMDBiZWRkMWNhNzI0N2RmNGZlNzQxM2YifSwic3ViamVjdCI6eyJwdWJsaWNLZXkiOiIwMjk2ZDk4OGUzYTMxZWY1ZWEzMWRmZjA2OGM5NGM1MmI3ZDgyMTNlOGFhMDBiZWRkMWNhNzI0N2RmNGZlNzQxM2YifX0.yfOGjIvZM2MVeskYY-t1FL8J8IgAlj75EgSWEXngBjTxXyLtFj4d_y1w1hfmG99dgLo3tdDrUHO-w5wC64n0Rw"}]

You would upload the resulting JWT to your various storage providers listed in your zone file. For example, my name’s zone contains this:

$ blockstack get_name_zonefile judecn.id                                                                                                                                                                                                          
$ORIGIN judecn.id                                                                                                                                                                                                                                                               
$TTL 3600
_https._tcp URI 10 1 "https://raw.githubusercontent.com/jcnelson/profile/master/judecn.id"
_https._tcp URI 10 1 "https://www.cs.princeton.edu/~jcnelson/judecn.id"

I would put my signed JWT at one or both of these URLs in order for you and others to resolve it (and for it to show up in the explorer).

1 Like
#3

Dear @jude,

thank you a lot for helping me. I’ll try this.

#4

What has happened so far:

I have saved the claim object of profile.json in a new file stulle.id.jsonand removed the corrupt YouTube section:

{
  "@type": "Person",
  "@context": "http://schema.org",
  "givenName": "Markus",
  "familyName": "Stulle",
  "image": [
    {
      "@type": "ImageObject",
      "name": "avatar",
      "contentUrl": "https://www.dropbox.com/s/1b37klp3vr4sy2a/avatar-0?dl=1"
    }
  ],
  "account": [
    {
      "@type": "Account",
      "service": "twitter",
      "identifier": "markus_stulle",
      "proofType": "http",
      "proofUrl": "https://twitter.com/markus_stulle/status/918370479693533184",
      "placeholder": false
    },
    {
      "@type": "Account",
      "service": "facebook",
      "identifier": "markus.stulle.1",
      "proofType": "http",
      "proofUrl": "https://www.facebook.com/markus.stulle.1/posts/798795986967349",
      "placeholder": false
    },            
    {
      "@type": "Account",
      "service": "pgp",
      "identifier": "68ADB7A23C5D774E89A7C5F75D9B9925713B5056",
      "proofType": "signature",
      "proofMessage": "Verifying that stulle.id is my blockchain ID.",
      "proofSignature": "-----BEGIN PGP SIGNATURE-----  iQEzBAABCAAdFiEEaK23ojxdd06Jp8X3XZuZJXE7UFYFAlnduiAACgkQXZuZJXE7 UFb/GQf/ZSpMssm/t2JkZs8yD/8nFzEO543bCShL705sBeKeu7HVv8qphkR+dDiS rnJxQQRnYgdGSpcedYtUbpYfuKfzYTUvY4DAwFvsTiMMcq+d+5B+8XRexvbOi9kG Rin9E1KFwpTfkQgIHI60r3hXIQYkP6nnQdAjbrbS7zVB87RE2WF6/RPR64iAMm1S l2BzFJnT+fMCRLWmU+yyoKR+SHjDiWlCmB2iXwaYM+ZVRUPMD/LmFxKdBeRNbURW z2SEnlTECkie6po5Si2ZBssFLn10v3CVJnUnPiIZ8bsHVLYizf5HIaGVoO4PR/0i wbaHnEuWRZojAoGYZBWlnuRdgPMpEg== =+H3v -----END PGP SIGNATURE-----",
      "publicKey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBFnJ53MBCADLlVSyf3bZJMnsqO0hrQqihwMYsRtyU4SAkV6dFXfcdmZCk/Fe\nlyjZbJohe3vgex1AxI0SdnBgSBVQWBHM72NZqr2SiCTziOoWm/Za3KUcF5Blps+g\nyVBHLE5e1mQoywLUEtmcHK82S9/COXbMPkkEx+rcar/e5bGUg/E3hBvneTr1t2MV\nn13CreSCnHu6g6k1/tMPd78W91nG9lOgIjEUcZYT4nEHN1WonTdCjzdEYukhCUGF\nwsE/6coOEP0duwWXCmTRFeTctJgD3+oawI0mTyoovfyVFoCMu0/4h2OXrUY9+N1e\nrwc0gRJp2WmQLEZr/CUg0ZTAGYq6UD1jfpPFABEBAAG0LkRyLi1JbmcuIE1hcmt1\ncyBBLiBTdHVsbGUgPG1hcmt1c0BzdHVsbGUuem9uZT6JAU4EEwEIADgWIQRorbei\nPF13Tomnxfddm5klcTtQVgUCWcnncwIbIwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX\ngAAKCRBdm5klcTtQVvd7B/4vGyBYvIkACcfNfOeVwN97DiV0n3LQctxP/9ptutfq\nI0go/x/OqPBzejrcTF79xcE2sXgRPBIO6mZqQOOw7Uir96YnWnV34gJ1KDsv59kp\nGhHJ5FVh5PaWzjSca9Fivi7xD7BhGL/sJOON3ZcYpc+uot/n08BGTcsODIbjFrPu\nKRpPPHWInZMmiughUIRQp9dB2MQPGqG1nkyHSpHeywaWdjIBQvtMe4gNnlM8x1hD\nAXtPSTHLUEI7711AYRgBTKBws2hNVxT8sIqhry57HbWRJc+awJQDApTMgLWvx3gv\n+iV4LLQ92nVtHr3HCSFZBbOBQE1a4SqTjyPBcsz1BONruQENBFnJ53MBCADH+nD3\nvpeXhsOY+4Zs8qn7ytD5uKtdtIIwUK56mZBH1Ac/FKM0c4Pji8SZeyfTs8cP2+7y\nfGzpVi4TE0l+2iT32Utpwk9HhydgrL6vL9Xc1K1UlHxHHoxB8tu/cpYXxbJalNIS\nNz0tcJAT3azesB6MLPkkin16+eccI0p90zRHr0zNOWfVEmE9pVbi9FHsLX/JRtZw\ns1bTWY7QWzxsSnJHsRDPS4s35mi6MgY8DFk4VS1OVGUs87cOufRcdiiYWkX+iEWm\nd1HDLFa7884hFKfOt9ZPGPZOonZuR+IScZu8nQjZSGLLLeMuUMmr9/m1pdLu5XZK\naonTHyrocuFDBRO1ABEBAAGJATYEGAEIACAWIQRorbeiPF13Tomnxfddm5klcTtQ\nVgUCWcnncwIbDAAKCRBdm5klcTtQVl+ZB/98NmeF9hFF2bkwGtQdiwmwA1Q+WZi7\n7sPkrKW+WtvReZQr7kQUfeLNjHl5DT0+gByB72NB4u3hIiK+jFWMxry2eOTcq5mv\nS2NoRELQAI74RDpjzs9dDaVJtQxqQ99Va5t5MIyhr2RpEXvtNcI+gPmi7Xh/l2xg\n0uTnRSEKWNCAOjZgnqP2if2pKJS5WX9Eg0jvUx86g/xUD2Y24kxNTQm8553B4clg\nV43yUiKFCy7v6vl/auLPZTjse0Xg2LjqeZslmq2qhFUVLXNYg/RSeLysTOGBDjKv\nAN12knz3skl3Iz+aldmXR2kOr2R/2+uEY/DbKfT3tnrA8N5srgLwOx+k\n=4is1\n-----END PGP PUBLIC KEY BLOCK-----",
      "placeholder": false
    },
    {
      "@type": "Account",
      "service": "github",
      "identifier": "relianz",
      "proofType": "http",
      "proofUrl": "https://gist.github.com/relianz/bbff12669ec2ef55e09535ca5ec6dcd3",
      "placeholder": false
    }
  ],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Maxvorstadt",
    "addressLocality": "Munich",
    "postalCode": "80797",
    "addressCountry": "Germany"
  },
  "birthDate": "1963/03/06",
  "description": "Founder of digidoc.world"
}

I then signed the new file using the Blockstack CLI:

E:\> docker exec -it blockstack-api /bin/bash	 
[email protected]:/src/blockstack# blockstack --api_password 12345... sign_profile /tmp/stulle.id.json > /tmp/stulle.id.signed.json

[email protected]:/src/blockstack# file /tmp/stulle.id.signed.json
/tmp/stulle.id.signed.json: ASCII text, with very long lines

[email protected]:/src/blockstack# cat /tmp/stulle.id.signed.json
[{"encrypted": false, "parentPublicKey": "0325c6787d3689c0c2dde115a9ae4f574d36c965c277e4184d8c8903b8dc2f95af", "token": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJpc3N1ZWRBdCI6IjIwMTctMTAtMTZUMTg6MzE6NDkuNjE0MjIwIiwiY2xhaW0iOnsiYWNjb3VudCI6W3sic2VydmljZSI6InR3aXR0ZXIiLCJwcm9vZlVybCI6Imh0dHBzOi8vdHdpdHRlci5jb20vbWFya3VzX3N0dWxsZS9zdGF0dXMvOTE4MzcwNDc5NjkzNTMzMTg0IiwicHJvb2ZUeXBlIjoiaHR0cCIsImlkZW50aWZpZXIiOiJtYXJrdXNfc3R1bGxlIiwicGxhY2Vob2xkZXIiOmZhbHNlLCJAdHlwZSI6IkFjY291bnQifSx7InNlcnZpY2UiOiJmYWNlYm9vayIsInByb29mVXJsIjoiaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL21hcmt1cy5zdHVsbGUuMS9wb3N0cy83OTg3OTU5ODY5NjczNDkiLCJwcm9vZlR5cGUiOiJodHRwIiwiaWRlbnRpZmllciI6Im1hcmt1cy5zdHVsbGUuMSIsInBsYWNlaG9sZGVyIjpmYWxzZSwiQHR5cGUiOiJBY2NvdW50In0seyJwcm9vZk1lc3NhZ2UiOiJWZXJpZnlpbmcgdGhhdCBzdHVsbGUuaWQgaXMgbXkgYmxvY2tjaGFpbiBJRC4iLCJzZXJ2aWNlIjoicGdwIiwicHVibGljS2V5IjoiLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXG5cbm1RRU5CRm5KNTNNQkNBRExsVlN5ZjNiWkpNbnNxTzBoclFxaWh3TVlzUnR5VTRTQWtWNmRGWGZjZG1aQ2svRmVcbmx5alpiSm9oZTN2Z2V4MUF4STBTZG5CZ1NCVlFXQkhNNzJOWnFyMlNpQ1R6aU9vV20vWmEzS1VjRjVCbHBzK2dcbnlWQkhMRTVlMW1Rb3l3TFVFdG1jSEs4MlM5L0NPWGJNUGtrRXgrcmNhci9lNWJHVWcvRTNoQnZuZVRyMXQyTVZcbm4xM0NyZVNDbkh1Nmc2azEvdE1QZDc4Vzkxbkc5bE9nSWpFVWNaWVQ0bkVITjFXb25UZENqemRFWXVraENVR0ZcbndzRS82Y29PRVAwZHV3V1hDbVRSRmVUY3RKZ0QzK29hd0kwbVR5b292ZnlWRm9DTXUwLzRoMk9YclVZOStOMWVcbnJ3YzBnUkpwMldtUUxFWnIvQ1VnMFpUQUdZcTZVRDFqZnBQRkFCRUJBQUcwTGtSeUxpMUpibWN1SUUxaGNtdDFcbmN5QkJMaUJUZEhWc2JHVWdQRzFoY210MWMwQnpkSFZzYkdVdWVtOXVaVDZKQVU0RUV3RUlBRGdXSVFSb3JiZWlcblBGMTNUb21ueGZkZG01a2xjVHRRVmdVQ1djbm5jd0liSXdVTENRZ0hBZ1lWQ0FrS0N3SUVGZ0lEQVFJZUFRSVhcbmdBQUtDUkJkbTVrbGNUdFFWdmQ3Qi80dkd5Qll2SWtBQ2NmTmZPZVZ3Tjk3RGlWMG4zTFFjdHhQLzlwdHV0ZnFcbkkwZ28veC9PcVBCemVqcmNURjc5eGNFMnNYZ1JQQklPNm1acVFPT3c3VWlyOTZZblduVjM0Z0oxS0RzdjU5a3BcbkdoSEo1RlZoNVBhV3pqU2NhOUZpdmk3eEQ3QmhHTC9zSk9PTjNaY1lwYyt1b3QvbjA4QkdUY3NPREliakZyUHVcbktScFBQSFdJblpNbWl1Z2hVSVJRcDlkQjJNUVBHcUcxbmt5SFNwSGV5d2FXZGpJQlF2dE1lNGdObmxNOHgxaERcbkFYdFBTVEhMVUVJNzcxMUFZUmdCVEtCd3MyaE5WeFQ4c0lxaHJ5NTdIYldSSmMrYXdKUURBcFRNZ0xXdngzZ3ZcbitpVjRMTFE5Mm5WdEhyM0hDU0ZaQmJPQlFFMWE0U3FUanlQQmNzejFCT05ydVFFTkJGbko1M01CQ0FESCtuRDNcbnZwZVhoc09ZKzRaczhxbjd5dEQ1dUt0ZHRJSXdVSzU2bVpCSDFBYy9GS00wYzRQamk4U1pleWZUczhjUDIrN3lcbmZHenBWaTRURTBsKzJpVDMyVXRwd2s5SGh5ZGdyTDZ2TDlYYzFLMVVsSHhISG94Qjh0dS9jcFlYeGJKYWxOSVNcbk56MHRjSkFUM2F6ZXNCNk1MUGtraW4xNitlY2NJMHA5MHpSSHIwek5PV2ZWRW1FOXBWYmk5RkhzTFgvSlJ0WndcbnMxYlRXWTdRV3p4c1NuSkhzUkRQUzRzMzVtaTZNZ1k4REZrNFZTMU9WR1VzODdjT3VmUmNkaWlZV2tYK2lFV21cbmQxSERMRmE3ODg0aEZLZk90OVpQR1BaT29uWnVSK0lTY1p1OG5RalpTR0xMTGVNdVVNbXI5L20xcGRMdTVYWktcbmFvblRIeXJvY3VGREJSTzFBQkVCQUFHSkFUWUVHQUVJQUNBV0lRUm9yYmVpUEYxM1RvbW54ZmRkbTVrbGNUdFFcblZnVUNXY25uY3dJYkRBQUtDUkJkbTVrbGNUdFFWbCtaQi85OE5tZUY5aEZGMmJrd0d0UWRpd213QTFRK1daaTdcbjdzUGtyS1crV3R2UmVaUXI3a1FVZmVMTmpIbDVEVDArZ0J5QjcyTkI0dTNoSWlLK2pGV014cnkyZU9UY3E1bXZcblMyTm9SRUxRQUk3NFJEcGp6czlkRGFWSnRReHFROTlWYTV0NU1JeWhyMlJwRVh2dE5jSStnUG1pN1hoL2wyeGdcbjB1VG5SU0VLV05DQU9qWmducVAyaWYycEtKUzVXWDlFZzBqdlV4ODZnL3hVRDJZMjRreE5UUW04NTUzQjRjbGdcblY0M3lVaUtGQ3k3djZ2bC9hdUxQWlRqc2UwWGcyTGpxZVpzbG1xMnFoRlVWTFhOWWcvUlNlTHlzVE9HQkRqS3ZcbkFOMTJrbnozc2tsM0l6K2FsZG1YUjJrT3IyUi8yK3VFWS9EYktmVDN0bnJBOE41c3JnTHdPeCtrXG49NGlzMVxuLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLSIsInByb29mU2lnbmF0dXJlIjoiLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0gIGlRRXpCQUFCQ0FBZEZpRUVhSzIzb2p4ZGQwNkpwOFgzWFp1WkpYRTdVRllGQWxuZHVpQUFDZ2tRWFp1WkpYRTcgVUZiL0dRZi9aU3BNc3NtL3QySmtaczh5RC84bkZ6RU81NDNiQ1NoTDcwNXNCZUtldTdIVnY4cXBoa1IrZERpUyBybkp4UVFSbllnZEdTcGNlZFl0VWJwWWZ1S2Z6WVRVdlk0REF3RnZzVGlNTWNxK2QrNUIrOFhSZXh2Yk9pOWtHIFJpbjlFMUtGd3BUZmtRZ0lISTYwcjNoWElRWWtQNm5uUWRBamJyYlM3elZCODdSRTJXRjYvUlBSNjRpQU1tMVMgbDJCekZKblQrZk1DUkxXbVUreXlvS1IrU0hqRGlXbENtQjJpWHdhWU0rWlZSVVBNRC9MbUZ4S2RCZVJOYlVSVyB6MlNFbmxURUNraWU2cG81U2kyWkJzc0ZMbjEwdjNDVkpuVW5QaUlaOGJzSFZMWWl6ZjVISWFHVm9PNFBSLzBpIHdiYUhuRXVXUlpvakFvR1laQldsbnVSZGdQTXBFZz09ID0rSDN2IC0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLSIsInByb29mVHlwZSI6InNpZ25hdHVyZSIsImlkZW50aWZpZXIiOiI2OEFEQjdBMjNDNUQ3NzRFODlBN0M1Rjc1RDlCOTkyNTcxM0I1MDU2IiwicGxhY2Vob2xkZXIiOmZhbHNlLCJAdHlwZSI6IkFjY291bnQifSx7InNlcnZpY2UiOiJnaXRodWIiLCJwcm9vZlVybCI6Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3JlbGlhbnovYmJmZjEyNjY5ZWMyZWY1NWUwOTUzNWNhNWVjNmRjZDMiLCJwcm9vZlR5cGUiOiJodHRwIiwiaWRlbnRpZmllciI6InJlbGlhbnoiLCJwbGFjZWhvbGRlciI6ZmFsc2UsIkB0eXBlIjoiQWNjb3VudCJ9XSwiZGVzY3JpcHRpb24iOiJGb3VuZGVyIG9mIGRpZ2lkb2Mud29ybGQiLCJpbWFnZSI6W3siY29udGVudFVybCI6Imh0dHBzOi8vd3d3LmRyb3Bib3guY29tL3MvMWIzN2tscDN2cjRzeTJhL2F2YXRhci0wP2RsPTEiLCJAdHlwZSI6IkltYWdlT2JqZWN0IiwibmFtZSI6ImF2YXRhciJ9XSwiZmFtaWx5TmFtZSI6IlN0dWxsZSIsImJpcnRoRGF0ZSI6IjE5NjMvMDMvMDYiLCJhZGRyZXNzIjp7ImFkZHJlc3NMb2NhbGl0eSI6Ik11bmljaCIsInBvc3RhbENvZGUiOiI4MDc5NyIsInN0cmVldEFkZHJlc3MiOiJNYXh2b3JzdGFkdCIsImFkZHJlc3NDb3VudHJ5IjoiR2VybWFueSIsIkB0eXBlIjoiUG9zdGFsQWRkcmVzcyJ9LCJAY29udGV4dCI6Imh0dHA6Ly9zY2hlbWEub3JnIiwiZ2l2ZW5OYW1lIjoiTWFya3VzIiwiQHR5cGUiOiJQZXJzb24ifSwiZXhwaXJlc0F0IjoiMjAxOC0xMC0xNlQxODozMTo0OS42MTQyMjAiLCJpc3N1ZXIiOnsicHVibGljS2V5IjoiMDMyNWM2Nzg3ZDM2ODljMGMyZGRlMTE1YTlhZTRmNTc0ZDM2Yzk2NWMyNzdlNDE4NGQ4Yzg5MDNiOGRjMmY5NWFmIn0sInN1YmplY3QiOnsicHVibGljS2V5IjoiMDMyNWM2Nzg3ZDM2ODljMGMyZGRlMTE1YTlhZTRmNTc0ZDM2Yzk2NWMyNzdlNDE4NGQ4Yzg5MDNiOGRjMmY5NWFmIn19.qsOv7rJikBRkyyo63gxDGqIa8uVAk2eLnu3rIIjIkFvcXsqZrFL2u4mnoy3U0i7RPRZGdvA6eAO22QlAr5dKBg"}]

I copied the file to the Dropbox and checked the online content using the URI from the zonefile:

[email protected]:/src/blockstack# blockstack get_name_zonefile stulle.id
$ORIGIN stulle.id
$TTL 3600
_http._tcp URI 10 1 "https://www.dropbox.com/s/asug40ooms7zlzi/profile.json?dl=1"

[email protected]:/src/blockstack# exit
exit

E:\tmp\.blockstack_tmp> copy stulle.id.signed.json C:\Users\marku\Dropbox\Apps\Blockstack\stulle.id\profile.json
C:\Users\marku\Dropbox\Apps\Blockstack\stulle.id\profile.json überschreiben? (Ja/Nein/Alle): j
1 Datei(en) kopiert.

E:\tmp\.blockstack_tmp> powershell
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. Alle Rechte vorbehalten. 

PS E:\tmp\.blockstack_tmp> $profile = Invoke-WebRequest -Uri https://www.dropbox.com/s/asug40ooms7zlzi/profile.json?dl=1
PS E:\tmp\.blockstack_tmp> ConvertFrom-Json $profile

encrypted parentPublicKey                                                    token
--------- ---------------                                                    -----
    False 0325c6787d3689c0c2dde115a9ae4f574d36c965c277e4184d8c8903b8dc2f95af eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJp...

So far I had a good feeling, thanks again @jude!

I waited a few hours and then navigated Chrome to [https://explorer.blockstack.org/name/stulle.id]. Unfortunately the Explorer now hangs with the message Loading zone file...:

Any idea what I did wrong?

#5

I decoded the actual token on [https://jwt.io/], which has led to the following data:

Header:

{
  "alg": "ES256K",
  "typ": "JWT"
}

Payload:

{
  "issuedAt": "2017-10-16T18:31:49.614220",
  "claim": {
    "account": [
      {
        "service": "twitter",
        "proofUrl": "https://twitter.com/markus_stulle/status/918370479693533184",
        "proofType": "http",
        "identifier": "markus_stulle",
        "placeholder": false,
        "@type": "Account"
      },
      {
        "service": "facebook",
        "proofUrl": "https://www.facebook.com/markus.stulle.1/posts/798795986967349",
        "proofType": "http",
        "identifier": "markus.stulle.1",
        "placeholder": false,
        "@type": "Account"
      },
      {
        "proofMessage": "Verifying that stulle.id is my blockchain ID.",
        "service": "pgp",
        "publicKey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBFnJ53MBCADLlVSyf3bZJMnsqO0hrQqihwMYsRtyU4SAkV6dFXfcdmZCk/Fe\nlyjZbJohe3vgex1AxI0SdnBgSBVQWBHM72NZqr2SiCTziOoWm/Za3KUcF5Blps+g\nyVBHLE5e1mQoywLUEtmcHK82S9/COXbMPkkEx+rcar/e5bGUg/E3hBvneTr1t2MV\nn13CreSCnHu6g6k1/tMPd78W91nG9lOgIjEUcZYT4nEHN1WonTdCjzdEYukhCUGF\nwsE/6coOEP0duwWXCmTRFeTctJgD3+oawI0mTyoovfyVFoCMu0/4h2OXrUY9+N1e\nrwc0gRJp2WmQLEZr/CUg0ZTAGYq6UD1jfpPFABEBAAG0LkRyLi1JbmcuIE1hcmt1\ncyBBLiBTdHVsbGUgPG1hcmt1c0BzdHVsbGUuem9uZT6JAU4EEwEIADgWIQRorbei\nPF13Tomnxfddm5klcTtQVgUCWcnncwIbIwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX\ngAAKCRBdm5klcTtQVvd7B/4vGyBYvIkACcfNfOeVwN97DiV0n3LQctxP/9ptutfq\nI0go/x/OqPBzejrcTF79xcE2sXgRPBIO6mZqQOOw7Uir96YnWnV34gJ1KDsv59kp\nGhHJ5FVh5PaWzjSca9Fivi7xD7BhGL/sJOON3ZcYpc+uot/n08BGTcsODIbjFrPu\nKRpPPHWInZMmiughUIRQp9dB2MQPGqG1nkyHSpHeywaWdjIBQvtMe4gNnlM8x1hD\nAXtPSTHLUEI7711AYRgBTKBws2hNVxT8sIqhry57HbWRJc+awJQDApTMgLWvx3gv\n+iV4LLQ92nVtHr3HCSFZBbOBQE1a4SqTjyPBcsz1BONruQENBFnJ53MBCADH+nD3\nvpeXhsOY+4Zs8qn7ytD5uKtdtIIwUK56mZBH1Ac/FKM0c4Pji8SZeyfTs8cP2+7y\nfGzpVi4TE0l+2iT32Utpwk9HhydgrL6vL9Xc1K1UlHxHHoxB8tu/cpYXxbJalNIS\nNz0tcJAT3azesB6MLPkkin16+eccI0p90zRHr0zNOWfVEmE9pVbi9FHsLX/JRtZw\ns1bTWY7QWzxsSnJHsRDPS4s35mi6MgY8DFk4VS1OVGUs87cOufRcdiiYWkX+iEWm\nd1HDLFa7884hFKfOt9ZPGPZOonZuR+IScZu8nQjZSGLLLeMuUMmr9/m1pdLu5XZK\naonTHyrocuFDBRO1ABEBAAGJATYEGAEIACAWIQRorbeiPF13Tomnxfddm5klcTtQ\nVgUCWcnncwIbDAAKCRBdm5klcTtQVl+ZB/98NmeF9hFF2bkwGtQdiwmwA1Q+WZi7\n7sPkrKW+WtvReZQr7kQUfeLNjHl5DT0+gByB72NB4u3hIiK+jFWMxry2eOTcq5mv\nS2NoRELQAI74RDpjzs9dDaVJtQxqQ99Va5t5MIyhr2RpEXvtNcI+gPmi7Xh/l2xg\n0uTnRSEKWNCAOjZgnqP2if2pKJS5WX9Eg0jvUx86g/xUD2Y24kxNTQm8553B4clg\nV43yUiKFCy7v6vl/auLPZTjse0Xg2LjqeZslmq2qhFUVLXNYg/RSeLysTOGBDjKv\nAN12knz3skl3Iz+aldmXR2kOr2R/2+uEY/DbKfT3tnrA8N5srgLwOx+k\n=4is1\n-----END PGP PUBLIC KEY BLOCK-----",
        "proofSignature": "-----BEGIN PGP SIGNATURE-----  iQEzBAABCAAdFiEEaK23ojxdd06Jp8X3XZuZJXE7UFYFAlnduiAACgkQXZuZJXE7 UFb/GQf/ZSpMssm/t2JkZs8yD/8nFzEO543bCShL705sBeKeu7HVv8qphkR+dDiS rnJxQQRnYgdGSpcedYtUbpYfuKfzYTUvY4DAwFvsTiMMcq+d+5B+8XRexvbOi9kG Rin9E1KFwpTfkQgIHI60r3hXIQYkP6nnQdAjbrbS7zVB87RE2WF6/RPR64iAMm1S l2BzFJnT+fMCRLWmU+yyoKR+SHjDiWlCmB2iXwaYM+ZVRUPMD/LmFxKdBeRNbURW z2SEnlTECkie6po5Si2ZBssFLn10v3CVJnUnPiIZ8bsHVLYizf5HIaGVoO4PR/0i wbaHnEuWRZojAoGYZBWlnuRdgPMpEg== =+H3v -----END PGP SIGNATURE-----",
        "proofType": "signature",
        "identifier": "68ADB7A23C5D774E89A7C5F75D9B9925713B5056",
        "placeholder": false,
        "@type": "Account"
      },
      {
        "service": "github",
        "proofUrl": "https://gist.github.com/relianz/bbff12669ec2ef55e09535ca5ec6dcd3",
        "proofType": "http",
        "identifier": "relianz",
        "placeholder": false,
        "@type": "Account"
      }
    ],
    "description": "Founder of digidoc.world",
    "image": [
      {
        "contentUrl": "https://www.dropbox.com/s/1b37klp3vr4sy2a/avatar-0?dl=1",
        "@type": "ImageObject",
        "name": "avatar"
      }
    ],
    "familyName": "Stulle",
    "birthDate": "1963/03/06",
    "address": {
      "addressLocality": "Munich",
      "postalCode": "80797",
      "streetAddress": "Maxvorstadt",
      "addressCountry": "Germany",
      "@type": "PostalAddress"
    },
    "@context": "http://schema.org",
    "givenName": "Markus",
    "@type": "Person"
  },
  "expiresAt": "2018-10-16T18:31:49.614220",
  "issuer": {
    "publicKey": "0325c6787d3689c0c2dde115a9ae4f574d36c965c277e4184d8c8903b8dc2f95af"
  },
  "subject": {
    "publicKey": "0325c6787d3689c0c2dde115a9ae4f574d36c965c277e4184d8c8903b8dc2f95af"
  }
}

That looks pretty good, doesn’t it? Maybe the Explorer cannot verify the signature?

Markus.

#6

When comparing the payload of the file profile.json created with Blockstack version 0.14 and the decoded token resulting from sign_profile in version 0.17, the following is noticeable:

The payload from version 0.17 is missing the elements jti and iat, that are present in the file profile.json from version 0.14:

"jti": "c5be0d4a-0ab7-4318-9ccd-31ae9767bd9d",
"iat": "2017-10-13T05:22:37.315Z",

The file profile.json specified the expiry date using

"exp": "2018-10-13T05:22:37.315Z",

while in the new file the value is given as

"expiresAt": "2018-10-16T18:31:49.614220",

I highly apologize for the noise I’m making here. But testing the maturity and suitability of Blockstack as a technological basis for our start-up [https://digidoc.world] is an important concern.

#7

Unfortunately, I have to consider the experiment of manually editing the profile as failed. To make the Explorer happy again, I reset the content of [https://www.dropbox.com/s/asug40ooms7zlzi/profile.json] (the URI comes from the zone file) to the JWT generated by version 0.14of Blockstack.

#8

Hey @relianz,

Thank you for your detailed report! You’re not doing anything wrong–your profile is well-formed.

I was looking into this yesterday as well, to see why the explorer wasn’t loading your profile. The sign_profile command was designed with the assumption that you have a data public key listed in your zone file. Normally, another user would find the public key in your zone file and use it to authenticate the profile.

It turns out that the sign_profile command has a bug: it will sign your profile with your wallet’s data private key, but it does not check your zone file to verify that you have a data public key listed. If not, then the profile will fail to authenticate, since the person doing the lookup won’t know which key to use.

I will push an update to the CLI that fixes this. The command should detect that you do not have a data public key listed in your zone file, and fall back to using the owner public key in this case (which is what we do for profiles created in the browser). Apologies for not catching this corner case earlier; not many people use the sign_profile command.

1 Like
#9

Thank you so much for helping. Markus.