Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Mustafa Al-Bassam
Department of Computer Science
University College London
London, United Kingdom
m.albassam@cs.ucl.ac.uk
Table 1: Gas used for adding attributes in the full smart contract.
Data (bytes) Gas Gas in USD Gas (IPFS) Gas in USD
(IPFS)
100 41789 $0.008 38372 $0.007
200 49377 $0.009 38372 $0.007
300 57030 $0.011 38372 $0.007
400 64619 $0.012 38372 $0.007
500 72144 $0.014 38372 $0.007
Table 2: Gas used for adding attributes in the light smart contract.
Operation Gas Gas in USD
Publishing contract 729752 $0.139
Signing attribute 62799 $0.012
Revoking signature 22120 $0.004
Table 3: Gas used for other operations in the full smart contract.
Operation Gas Gas in USD
Publishing contract 353385 $0.067
Signing attribute 49904 $0.009
Revoking signature 22120 $0.004
Table 4: Gas used for other operations in the light smart contract.
Privacy. The system is only suitable for the publish- [7] R. Housley, W. Ford, W. Polk, and D. Solo. Internet
ing of attributes that the user wishes to make public (such x.509 public key infrastructure certificate and crl
as degree awards). It is not suitable for the publishing of profile. https://www.ietf.org/rfc/rfc2459, 1999.
more private identity attributes such as personal address [8] S. Nakamoto. Bitcoin: A peer-to-peer electronic cash
as all attributes can be viewed by anyone in the system system. https://bitcoin.org/bitcoin.pdf, 2008.
and there is no access control. Future iterations of the [9] H. F. Tipton. Official (ISC)2 Guide to the SSCP
system may address this by adding functionality to pub- CBK, Second Edition. Auerbach Publications, Boston,
lish “zero-knowledge” attributes for verification of privately MA, USA, 2nd edition, 2010.
shared data that the user distributes and has control over. [10] G. Wood. Ethereum: A secure decentralised
generalised transaction ledger (eip-150 revision).
6. REFERENCES https://github.com/ethereum/yellowpaper/raw/
[1] A next-generation smart contract and decentralized 2c6fba1400e321734ccec19cb5d9cb32a51ffc44/paper.
application platform. https: pdf, 2017.
//github.com/ethereum/wiki/wiki/White-Paper/
784a271b596e7fe4e047a2a585b733d631fcf1d4, 2016.
[2] Ethereum contract abi. https://github.com/ethereum/
wiki/wiki/Ethereum-Contract-ABI/
e6077256597058bd257f75740955caa10624086d, 2017.
[3] H. Adkins. Google online security blog: An update on
attempted man-in-the-middle attacks.
https://googleonlinesecurity.blogspot.fr/2011/08/
update-on-attempted-man-in-middle.html, 2011.
[4] A. M. Antonopoulos. Mastering Bitcoin: Unlocking
Digital Crypto-currencies. O’Reilly Media
Incorporated, 2014.
[5] T. Dierks and E. Rescorla. Rfc 5246 - the transport
layer security (tls) protocol version 1.2.
https://tools.ietf.org/html/rfc5246, 2008.
[6] S. Garfinkel. PGP: Pretty Good Privacy. O’Reilly &
Associates, 1994.
APPENDIX function revokeSignature ( uint signatureID )
returns ( uint revocationID ) {
A. FULL SMART CONTRACT if ( attributes [ signatureID ]. owner ==
msg . sender ) {
revocationID = revocations . length
contract SCPKI { ++;
struct Attribute { Revocation revocation =
address owner ; revocations [ revocationID ];
string attributeType ; revocation . signatureID =
bool has_proof ; signatureID ;
bytes32 identifier ; SignatureRevoked ( revocationID ,
string data ; signatureID ) ;
string datahash ; }
} }
}
struct Signature {
address signer ;
uint attributeID ; B. LIGHT SMART CONTRACT
uint expiry ;
} contract SCPKI {
struct Signature {
struct Revocation { address signer ;
uint signatureID ; }
}
uint public attributes ;
Attribute [] public attributes ; Signature [] public signatures ;
Signature [] public signatures ; uint public revocations ;
Revocation [] public revocations ;
event AttributeAdded ( uint indexed
event AttributeAdded ( uint indexed attributeID , address indexed owner ,
attributeID , address indexed owner , string attributeType , bool has_proof ,
string attributeType , bool has_proof , bytes32 indexed identifier , string
bytes32 indexed identifier , string data , string datahash ) ;
data , string datahash ) ; event AttributeSigned ( uint indexed
event AttributeSigned ( uint indexed signatureID , address indexed signer ,
signatureID , address indexed signer , uint indexed attributeID , uint expiry )
uint indexed attributeID , uint expiry ) ;
; event SignatureRevoked ( uint indexed
event SignatureRevoked ( uint indexed revocationID , uint indexed signatureID
revocationID , uint indexed signatureID );
);
function addAttribute ( string attributeType
function addAttribute ( string attributeType , bool has_proof , bytes32 identifier ,
, bool has_proof , bytes32 identifier , string data , string datahash ) returns
string data , string datahash ) returns ( uint attributeID ) {
( uint attributeID ) { attributeID = attributes ++;
attributeID = attributes . length ++; AttributeAdded ( attributeID , msg . sender
Attribute attribute = attributes [ , attributeType , has_proof ,
attributeID ]; identifier , data , datahash ) ;
attribute . owner = msg . sender ; }
attribute . attributeType =
attributeType ; function signAttribute ( uint attributeID ,
attribute . has_proof = has_proof ; uint expiry ) returns ( uint signatureID
attribute . identifier = identifier ; ) {
attribute . data = data ; signatureID = signatures . length ++;
attribute . datahash = datahash ; Signature signature = signatures [
AttributeAdded ( attributeID , msg . sender signatureID ];
, attributeType , has_proof , signature . signer = msg . sender ;
identifier , data , datahash ) ; AttributeSigned ( signatureID , msg .
} sender , attributeID , expiry ) ;
}
function signAttribute ( uint attributeID ,
uint expiry ) returns ( uint signatureID function revokeSignature ( uint signatureID )
) { returns ( uint revocationID ) {
signatureID = signatures . length ++; if ( signatures [ signatureID ]. signer ==
Signature signature = signatures [ msg . sender ) {
signatureID ]; revocationID = revocations ++;
signature . signer = msg . sender ; SignatureRevoked ( revocationID ,
signature . attributeID = attributeID ; signatureID ) ;
signature . expiry = expiry ; }
AttributeSigned ( signatureID , msg . }
sender , attributeID , expiry ) ; }
}