Ixian Documentation Welcome to Ixian Documentation Pages, here you can learn more about Ixian and how to get started quickly!

Cryptographic primitives

Below is a list of all cryptographic operations used by the Ixian DLT and S2 networks. The list contains a brief reasoning for the choice and a list places where the primitive is being used.

Signature - RSA with SHA512

See: RSACryptoServiceProvider.SignData

Key size: Minimum 4096 bits

Used for

Code file Function Input data Reason
Block.cs applySignature() blockChecksum Working of the Ixian’s Consensus algorithm - nodes sign the block they consider valid with their private key using RSA/SHA512 to achieve an acceptable speed of verification.
Block.cs verifySignature() blockChecksum Each signature on the Block is verified against the signing node’s public key in the WalletState. Valid signatures are counted to determine the block acceptance consensus.
CoreNetworkProtocol.cs sendHelloMessage() unique device identification data Nodes sign their unique identification when they send the initial protocol handshake message to prevent impersonation on the network.
CoreNetworkProtocol.cs processHelloMessage() unique device identification data Upon receiving the Hello message, each node should verify that the signature is valid, in order to prevent impersonation on the network.
PresenceList.cs keepAlive() unique device id + timestamp Nodes sign their Keep Alive messages in order to prevent impersonation and Presence List falsification.
PresenceList.cs receiveKeepAlive() unique device id + timestamp Keep alive messages which are received from neighbors are verified against the neighbor’s public key in the WalletState in order to prevent impersonation and Presence List manipulation.
Transaction.cs multiple functions transaction checksum Each transaction is signed by the Node which generated the transaction. RSA/SHA512 is used to achieve an acceptable verification throughput on Master Nodes.
Transaction.cs verifySignature() transaction checksum Each transaction is verified before being applied to the block chain, in order to ensure that it was sent by the owner of the wallet.

Hashing - SHA512sq

See SHA512Managed

Note: Ixian uses a squared/truncated version of the SHA512 algorithm. It is calculated as follows:

h1 = sha512(input_data);
h2 = sha512(h1);
return h2.First(hash_len);

Used for

Code file Function Input data Truncated length Reason
Address.cs constructAddress() base_address 3 bytes The last three bytes of an address are the checksum, used to ensure integrity during transmission or save/load.
Address.cs constructAddress_v1 public_key 44 bytes For addressees version 1, the squared/truncated hash value is used as the base of the address.
Block.cs calculateChecksum() block raw data 44 bytes For block version 2, the squared/truncated hash is used as the block checksum.
Block.cs calculateSignatureChecksum() block signatures 44 bytes For block version 2, the squared/truncated hash is used to generated the signature freeze checksum.
Activity.cs id property activity data 44 bytes The hash is used as a unique identifier for each Activity record.
CoreNetworkProtocol.cs prepareProtocolMessage() 32 bytes The hash is used by nodes on block version 2 to ensure network message integrity during transmission.  
CoreNetworkProtocol.cs readProtocolMessage() 32 bytes The hash is used by nodes on block version 2 to ensure network message integrity during transmission.  
NetworkRemoteEndpoint.cs sendData() 32 bytes The hash is used to ensure network message integrity during transmission by nodes on block version 2.  
Transaction.cs generateID() 44 bytes The hash is used as a part of the unique transaction identifier in version 2.  
Transaction.cs calculateChecksum() 44 bytes The hash is used as the transaction checksum, in order to protect the integrity of the data in version 2. This checksum is then used as the input data for the transaction sender signature.  
Wallet.cs calculateChecksum() 44 bytes The hash is used as the wallet checksum for version 2 wallets in order to prevent tampering and ensure integrity.  
WalletState.cs calculateWalletStateChecksum() 64 bytes The hash is used as the checksum for all wallet data in the WalletState. This is included in each block to validate a certain point-in-time state of all wallets.  
WalletStorage.cs generateNewAddress() 16 bytes The hashing algorithm is used to derive additional wallet version 1 addresses from the same public key, thus allowing the user to create new wallets and associate them with a single public/private key pair.  

Hashing - SHA512qu

See SHA512Managed

Note: Ixian uses a quad/truncated version of the SHA512 algorithm. It is calculated as follows:

h1 = sha512(input_data);
h2 = sha512(h1);
h3 = sha512(h2);
h4 = sha512(h3);
return h4.First(hash_len);

Used for

Code file Function Input data Truncated length Reason
Address.cs constructAddress_v0 public_key 44 bytes For addressees version 0, the quad/truncated hash value was used as the base of the address.
Block.cs calculateChecksum() block raw data 44 bytes For block version 0 and 1, the quad/truncated hash was used as the block checksum.
Block.cs calculateSignatureChecksum() block signatures 44 bytes For block version 0 and 1, the quad/truncated hash was used to generated the signature freeze checksum.
Activity.cs id property activity data 44 bytes The hash was used as a unique identifier for each Activity record.
CoreNetworkProtocol.cs prepareProtocolMessage() 32 bytes The hash was used by nodes on block version 0 and 1 to ensure network message integrity during transmission.  
CoreNetworkProtocol.cs readProtocolMessage() 32 bytes The hash was used by nodes on block version 0 and 1 to ensure network message integrity during transmission.  
NetworkRemoteEndpoint.cs sendData() 32 bytes The hash was used to ensure network message integrity during transmission by nodes on block version 0 and 1.  
Transaction.cs generateID() 44 bytes The hash was used as a part of the unique transaction identifier in version 0 and 1.  
Transaction.cs calculateChecksum() 44 bytes The hash was used as the transaction checksum, in order to protect the integrity of the data in version 0 and 1. This checksum is then used as the input data for the transaction sender signature.  
Wallet.cs calculateChecksum() 44 bytes The hash was used as the wallet checksum for version 0 and 1 wallets in order to prevent tampering and ensure integrity.  
WalletState.cs calculateWalletStateChecksum() 64 bytes The hash was used as the checksum for all wallet data in the WalletState before block version 2. This is included in each block to validate a certain point-in-time state of all wallets.  
WalletStorage.cs generateNewAddress() 16 bytes The hashing algorithm is used to derive additional wallet version 0 addresses from the same public key, thus allowing the user to create new wallets and associate them with a single public/private key pair.  

Cookies Policy

To make this site work properly, we sometimes place small data files called cookies on your device. Most big websites do this too.