The SmileyCoin Fund revisited

Background

The SmileyCoin Fund has been briefly explained earlier

Purpose of the Fund

The SmileyCoin Fund is set up to support education, educational technologies and projects which enhance the use of tutor-web and SmileyCoin

The Board of the SmileyCoin Fund

A formal Fund needs to have a process to handle applications

The SmileyCoin Fund has 4 Board members, nominated by 4 different organisations

Handout

The SmileyCoin Fund has a Board which accept applications for funding.

The Board has members from four different organisations, including the Rector’s office of the University of Iceland, as described in a public announcement.

The Mandate

A formal Mandate has been written and signed by all parties to the Board of the SmileyCoin Fund.

The signed Mandate is publicly available.

Handout

The Board has a formal mandate.

The multisig address for the Fund

The entire SmileyCoin Fund is stored in

one **multisig** address is available.

A technical document has been written to describe the details of how to operate the addressHandout

The entire SmileyCoin Fund is stored in one multisig address

3JT9LAzuMChCifVoQQK18BQV9z4BzpbQVH

This address can be viewed in a SmileyCoin block explorer .

A technical document has been written to describe the details of how to operate the address.

Creating, signing and broadcasting a multisig transaction

Some care is needed when sending from a multisig address

Signing the Mandate electronically

In addition to signing a piece of paper, a corresponding PDF file can be signed electronically.

Storing the signatures in public

Once a document has been signed, the signatures can be made public

The SMLY blockchain is the obvious place to store SmileyCoin-related signatures Handout ——-

Step 1: Get the final document in shape, including official signatures and addresses and scan it back in as PDF. This is in file mandate_signed.pdf

Step 2: Get the hash of the file

sha256sum < mandate_signed.pdf
09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a  -

Step 3: each party signs the message

UI:

signmessage BPbwDW2AWsE9KmFDRi1K6QrUdrHvkfbxfn
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a
IOYu+G3MZibkoVJigY3VaveGWvFqkbWliiqkp5Q/AYC01u8Rffj3QypV6Pyb6yVLdTdlqIp5+H8y/pm/0dVMTNk=

EIAS:

signmessage BSZNAqFuQCH3hZTqwmrqv8LDYPJuEYWfyv
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a
H5Wr/hJYWTgfZp2fPHAzh5wU7VFuARysMCXekIgOq7rwK9kArEURn9Zy9g430yFC4UyMwamwOVIu1HYPV9nxpq8=

STL:

signmessage BLE92S2zXshaczZ8GrojAXp8yD54UGRHDk
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a
IJ2pW06+guacTtmW6MdzWxcafjviD6MUvRM0Wssfm3Hqtesap6gRFQ6U2VT85/aRs1AvUnTeQRuQQ+e1HhGbxz4=

AMI:
signmessage BMv1CU9d9ghzB5HdtahWYz9N6NGpFVpSVB
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a
IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU2Q6mCdbfVOvUlOt0WGh6cgMw67Q=

Step 4: Verify all signatures

UI

verifymessage BPbwDW2AWsE9KmFDRi1K6QrUdrHvkfbxfn
  'IOYu+G3MZibkoVJigY3VaveGWvFqkbWliiqkp5Q/AYC01u8Rffj3QypV6Pyb6yVLdTdlqIp5+H8y/pm/0dVMTNk='
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a

EIAS

verifymessage BSZNAqFuQCH3hZTqwmrqv8LDYPJuEYWfyv
  'H5Wr/hJYWTgfZp2fPHAzh5wU7VFuARysMCXekIgOq7rwK9kArEURn9Zy9g430yFC4UyMwamwOVIu1HYPV9nxpq8='
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a

STL

verifymessage BLE92S2zXshaczZ8GrojAXp8yD54UGRHDk
  'IJ2pW06+guacTtmW6MdzWxcafjviD6MUvRM0Wssfm3Hqtesap6gRFQ6U2VT85/aRs1AvUnTeQRuQQ+e1HhGbxz4='
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a

AMI

verifymessage BMv1CU9d9ghzB5HdtahWYz9N6NGpFVpSVB
  IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU2Q6mCdbfVOvUlOt0WGh6cgMw67Q=
  09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a

Step 5: Convert all the signatures to hex

python3

  >>> import base64

UI

base64.decodestring(b'IOYu+G3MZibkoVJigY3VaveGWvFqkbWliiqkp5Q/AYC01u8R
ffj3QypV6Pyb6yVLdTdlqIp5+H8y/pm/0dVMTNk=').hex()
'20e62ef86dcc6626e4a15262818dd56af7865af16a91b5a58a2aa4a7943f0180
b4d6ef117df8f7432a55e8fc9beb254b753765a88a79f87f32fe99bfd1d54c4cd9'

EIAS

base64.decodestring(b'H5Wr/hJYWTgfZp2fPHAzh5wU7VFuARysMCXekIgOq7rwK9kArE
URn9Zy9g430yFC4UyMwamwOVIu1HYPV9nxpq8=').hex()
'1f95abfe125859381f669d9f3c7033879c14ed516e011cac3025de90880eabbaf02bd
900ac45119fd672f60e37d32142e14c8cc1a9b039522ed4760f57d9f1a6af'

STL

>>> base64.decodestring(b'IJ2pW06+guacTtmW6MdzWxcafjviD6MUvRM0Wssfm3Hqtesap6gR
   FQ6U2VT85/aRs1AvUnTeQRuQQ+e1HhGbxz4=').hex()
'209da95b4ebe82e69c4ed996e8c7735b171a7e3be20fa314bd13345acb1f9b71eab5eb1aa7a811
150e94d954fce7f691b3502f5274de411b9043e7b51e119bc73e'

AMI

>>> base64.decodestring(b'IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU
  2Q6mCdbfVOvUlOt0WGh6cgMw67Q=').hex()
 '20c077803a9cfda97887d1ac684cfb52dca91db0ab0fb75a436a888b4b35489860b984f427415580b9381e
 b314d90ea609d6df54ebd494eb7458687a720330ebb4'

Step 6: Stick the signatures into a single block

Next we need to pick any 4 UTXOs and create 4 transactions, which spend those outputs and send the signatures as data in these transactions, one per transaction. EIAS did this by setting up 4 UTXOs to a new address:

gstefans@eias_master:~$ smileycoin-cli sendtoaddress B9W6pvnb2WZpPWTA57Z9HZkbe7W3ZNvT1G 11
b867c61387570529e2905ba5c0dfc5912410a4cf9a6d52411e306c0d7128e8e0
gstefans@eias_master:~$ smileycoin-cli sendtoaddress B9W6pvnb2WZpPWTA57Z9HZkbe7W3ZNvT1G 11
2c2fdea0a9c6ecde1680c407dd9c6a821ffc60989dcfb245ce51276403a21f20
gstefans@eias_master:~$ smileycoin-cli sendtoaddress B9W6pvnb2WZpPWTA57Z9HZkbe7W3ZNvT1G 11
8235efa0a79b9fe42de292f51bf3860a25c719e5a7e5119531c8c5a7bdbc97cf
gstefans@eias_master:~$ smileycoin-cli sendtoaddress B9W6pvnb2WZpPWTA57Z9HZkbe7W3ZNvT1G 11
cc15dacac264763ac681cb08ef8e50a53a8e202e638e11c93a3e4f2e4065fac1

Check:

smileycoin-cli decoderawtransaction `smileycoin-cli getrawtransaction
b867c61387570529e2905ba5c0dfc5912410a4cf9a6d52411e306c0d7128e8e0`
smileycoin-cli decoderawtransaction `smileycoin-cli getrawtransaction
2c2fdea0a9c6ecde1680c407dd9c6a821ffc60989dcfb245ce51276403a21f20`
smileycoin-cli decoderawtransaction `smileycoin-cli getrawtransaction
8235efa0a79b9fe42de292f51bf3860a25c719e5a7e5119531c8c5a7bdbc97cf`
smileycoin-cli decoderawtransaction `smileycoin-cli getrawtransaction
cc15dacac264763ac681cb08ef8e50a53a8e202e638e11c93a3e4f2e4065fac1`

It is seen that each has a vout=0 of 11 SMLY to B9W6pvnb2WZpPWTA57Z9HZkbe7W3ZNvT1G.

Next we set up the actual commands. Note that in each case we only transmit 10 SMLY to the destination, leaving 1 SMLY for the transaction fee. We will simply use Betzyy, the EIAS donation address, for the destination.

So the 4 signatures:

20e62ef86dcc6626e4a15262818dd56af7865af16a91b5a58a2aa4a7943f0180b4d6ef117df8f7432a55e8fc9beb254b753765a88a79f87f32fe99bfd1d54c4cd9

1f95abfe125859381f669d9f3c7033879c14ed516e011cac3025de90880eabbaf02bd900ac45119fd672f60e37d32142e14c8cc1a9b039522ed4760f57d9f1a6af

209da95b4ebe82e69c4ed996e8c7735b171a7e3be20fa314bd13345acb1f9b71eab5eb1aa7a811150e94d954fce7f691b3502f5274de411b9043e7b51e119bc73e

20c077803a9cfda97887d1ac684cfb52dca91db0ab0fb75a436a888b4b35489860b984f427415580b9381eb314d90ea609d6df54ebd494eb7458687a720330ebb4

need to be paired with the 4 UTXOs

b867c61387570529e2905ba5c0dfc5912410a4cf9a6d52411e306c0d7128e8e0
2c2fdea0a9c6ecde1680c407dd9c6a821ffc60989dcfb245ce51276403a21f20
8235efa0a79b9fe42de292f51bf3860a25c719e5a7e5119531c8c5a7bdbc97cf
cc15dacac264763ac681cb08ef8e50a53a8e202e638e11c93a3e4f2e4065fac1

in transactions, using the createrawtransaction command, i.e. using

 smileycoin-cli createrawtransaction "[{\"txid\":\"TTTTT\",\"vout\":0}]" "
{\"BEtZyyYqDXqmRJJ45nnL15cuASfiXg9Yik\":10,\"data\":\"SSSSS\"}"

where TTTTT is the transaction Id for the UTXO and SSSSS is the hex representation of the signature.

smileycoin-cli createrawtransaction
 "[{\"txid\":\"b867c61387570529e2905ba5c0dfc5912410a4cf9a6d52411e306c0d7128e8e0\",
 \"vout\":0}]"
 "{\"BEtZyyYqDXqmRJJ45nnL15cuASfiXg9Yik\":10,
\"data\":\"20e62ef86dcc6626e4a15262818dd56af7865af16a91b5a58a2aa4a7943f01
80b4d6ef117df8f7432a55e8fc9beb254b753765a88a79f87f32fe99bfd1d54c4cd9\"}"

smileycoin-cli createrawtransaction
"[{\"txid\":\"2c2fdea0a9c6ecde1680c407dd9c6a821ffc60989dcfb245ce51276403a21f20\",
\"vout\":0}]"
"{\"BEtZyyYqDXqmRJJ45nnL15cuASfiXg9Yik\":10,
\"data\":\"1f95abfe125859381f669d9f3c7033879c14ed516e011cac3025de90880eabbaf02bd900a
  c45119fd672f60e37d32142e14c8cc1a9b039522ed4760f57d9f1a6af\"}"

smileycoin-cli createrawtransaction
 "[{\"txid\":\"8235efa0a79b9fe42de292f51bf3860a25c719e5a7e5119531c8c5a7bdbc97cf\",
 \"vout\":0}]" "{\"BEtZyyYqDXqmRJJ45nnL15cuASfiXg9Yik\":10,
   \"data\":\"209da95b4ebe82e69c4ed996e8c7735b171a7e3be20fa314bd13345acb1f9b
   71eab5eb1aa7a811150e94d954fce7f691b3502f5274de411b9043e7b51e119bc73e\"}"

smileycoin-cli createrawtransaction
  "[{\"txid\":\"cc15dacac264763ac681cb08ef8e50a53a8e202e638e11c93a3e4f2e4065fac1\",
     \"vout\":0}]" "{\"BEtZyyYqDXqmRJJ45nnL15cuASfiXg9Yik\":10,
     \"data\":\"20c077803a9cfda97887d1ac684cfb52dca91db0ab0fb75a436a888b4b35489860b
      984f427415580b9381eb314d90ea609d6df54ebd494eb7458687a720330ebb4\"}"

Finally each is signed

 smileycoin-cli signrawtransaction

0100000001e0e828710d6c301e41526d9acfa4102491c5dfc0a55b90e22905578713c667b80000000000ffffffff0200ca9a3b000000001976a9147283560a1a0e4d5ba2868e3ec7a7d98c6816d4e188ac0000000000000000436a4120e62ef86dcc6626e4a15262818dd56af7865af16a91b5a58a2aa4a7943f0180b4d6ef117df8f7432a55e8fc9beb254b753765a88a79f87f32fe99bfd1d54c4cd900000000

 smileycoin-cli signrawtransaction

0100000001201fa203642751ce45b2cf9d9860fc1f826a9cdd07c48016deecc6a9a0de2f2c0000000000ffffffff0200ca9a3b000000001976a9147283560a1a0e4d5ba2868e3ec7a7d98c6816d4e188ac0000000000000000436a411f95abfe125859381f669d9f3c7033879c14ed516e011cac3025de90880eabbaf02bd900ac45119fd672f60e37d32142e14c8cc1a9b039522ed4760f57d9f1a6af00000000

 smileycoin-cli signrawtransaction

0100000001cf97bcbda7c5c8319511e5a7e519c7250a86f31bf592e22de49f9ba7a0ef35820000000000ffffffff0200ca9a3b000000001976a9147283560a1a0e4d5ba2868e3ec7a7d98c6816d4e188ac0000000000000000436a41209da95b4ebe82e69c4ed996e8c7735b171a7e3be20fa314bd13345acb1f9b71eab5eb1aa7a811150e94d954fce7f691b3502f5274de411b9043e7b51e119bc73e00000000
 smileycoin-cli signrawtransaction

0100000001c1fa65402e4f3e3ac9118e632e208e3aa5508eef08cb81c63a7664c2cada15cc0000000000ffffffff0200ca9a3b000000001976a9147283560a1a0e4d5ba2868e3ec7a7d98c6816d4e188ac0000000000000000436a4120c077803a9cfda97887d1ac684cfb52dca91db0ab0fb75a436a888b4b35489860b984f427415580b9381eb314d90ea609d6df54ebd494eb7458687a720330ebb400000000

and broadcast using sendrawtransaction

These transactions were mined into block 538357.

Validating data from the blockchain

To check data stored in the blockchain, the reverse of the insertion sequence needs to be used.Handout

It is not enough to be able to store data on the blockchain, as it needs to be possible to verify the data and check any claims made.

First, look at the block. This is block 538357 and can be fetched directly using getblockhash followed by getblock, or viewed using a blockchain explorer:

https://chainz.cryptoid.info/smly/search.dws?q=538357

Pick one of these transactions, say a40d1b13ffb741d64e6630e0726ef82397d0930f93d639fa3126a519ea49b4af to find the data which goes with the OP_RETURN operator:

6a4120e62ef86dcc6626e4a15262818dd56af7865af16a91b5a
58a2aa4a7943f0180b4d6ef117df8f7432a55e8fc9beb254b75
3765a88a79f87f32fe99bfd1d54c4cd9

(all on one line with no spaces).

As with other hex codes, each character is codes as a two-digit hexadecimal number. The first two are 6a and 41 and the rest is the actual data string. The 6a is the code for OP_RETURN (see this link).

The actual hex coding is therefore 130 hexadecimal numbers or 65 bytes and since 65 in decimal is 41 hex (or 0x41), this explains the second code, 41, being the length of the data field.

To decode the string, a few python3 commands are useful:

 codecs.encode(codecs.decode('20c077803a9cfda97887d1ac684cfb52dca91db0ab
 0fb75a436a888b4b35489860b984f427415580b9381eb314d90ea609d6df54ebd494eb7458687a720330ebb4', 'hex'),
'base64').decode()
'IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU2Q6mCdbfVOvUlOt0\nWGh6cgMw67Q=\n'

The two newline characters need to be removed from this string, resulting in a signature of

'IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU2Q6mCdbfVOvUlOt0WGh6cgMw67Q='

Recall that the original hash to be signed was

09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a

and it was signed by 4 addresses:

BPbwDW2AWsE9KmFDRi1K6QrUdrHvkfbxfn
BSZNAqFuQCH3hZTqwmrqv8LDYPJuEYWfyv
BLE92S2zXshaczZ8GrojAXp8yD54UGRHDk
BMv1CU9d9ghzB5HdtahWYz9N6NGpFVpSVB

One can now verify this signature using the appropriate address:

smileycoin-cli verifymessage BMv1CU9d9ghzB5HdtahWYz9N6NGpFVpSVB
 'IMB3gDqc/al4h9GsaEz7UtypHbCrD7daQ2qIi0s1SJhguYT0J0FVgLk4HrMU2Q6mCdbfVOvUlOt0WGh6cgMw67Q='
 '09d3b7814390b0badfdf9550d848396f9ee7be202f8c61f6c678d71169ba0f9a'

which returns true as it should.

Open accounting on the blockchain

Transparency is one part of good governance

It is important for formal funds to demonstrate where grant allocations go

This can be done using a cryptocurrency and announcing exactly what is being done with the funds

Handout

Announcements of spending are sent out on Twitter.