MAIA explained

Taking advantage of the launching of MAIA’s website, it is explained how it works


Today we are launching a new website for MAIA ūüôā


Taking advantage of the occasion, I will explain you how MAIA works. To do this I will copy here some information from the website (this entry will last forever, but the content of the website will be modified in the future…).

IOTA uses Witernitz hash-based cryptography signatures. This has two implications:

  1. IOTA is resilient to quantum computing.
  2. An IOTA address should not be reused for payments.

IOTA addresses are 81 trytes long and are created using seeds of 81 trytes long too.


If you want to transfer X iotas from the address Ai to the address B, it is necessary to prove that you are the owner of Ai. How? Signing the transaction with the private key of Ai. Obviously, it is also necessary that Ai has associated at least X iotas.

Since you should not re-sign with the private key of Ai, when you transfer X to B, you must transfer the change Z, Z=(iotas in Ai)-X, to your new address Aj, j > i.


One reason why many of us love IOTAs is because it allows feeless transactions. Do not you think it is great?

Thanks to this, it is possible to make transactions with zero value. In this case, since it is not necessary to sign the transaction we can use the field for the signature of the message to store any other data.

But, what happens if it is necessary to demonstrate the authorship of the data? Well, in this case a possible option is to use MAM, a second layer data communication protocol which adds functionality to emit and access an encrypted data stream.

MAM provides several modes to control visibility and access, in particular it is possible to define private, restricted and public channels. The easiest to understand, and the ones that interest us are the public ones.

In a public channel anybody who knows the address of the channel will be able to read the messages published in it, but only the owner will be able to publish new messages.

To achieve the above, the operation of a public MAM channel is similar to the one used to generate addresses from the seed (similar != the same):

  1. Create a random seed,¬†S’.
  2. Initialize index, k=0.
  3. Create address Sk. Note that S0 is used to create the address of the channel
  4. Create message k, Mk. It includes:
    1. The payload.
    2. The address Sk+1.
  5. Create a bundle to transfer Mk and sign it using Sk private key.
  6. To publish a new message, Mk+1:
    1. Increase k, k=k+1
    2. Go to 3.


A possible use case for a public MAM channel is to provide the most recent version of a data. To do this, just read the channel until you get the last published message.


If the data is your valid IOTA address, the channel is your MAIA.


That’s all. In case you want to donate some IOTAs to support my work, send them to my¬†MAIA¬†donation address. (we are making changes to the protocol and sometimes the node that we use is down, so for now it is better that we do not take risks :’) ).

Note that MAIA has its own MAIA address, so if you want to donate some IOTAs to support the project send them here.

5 comments on “MAIA explained”

  1. Can you elaborate more on this part “If the data is your valid IOTA address, the channel is your MAIA.”?

    Is the MAM channel the address that subscriber will subscribe to? If yes then it is the first address A0 and still applicable to Witerniz signature and could not be reused for payments, right?

    If it is sth else then, how will the fund sent to an MAIA address end up under your control? There is no redirection to a different address, right?


    1. Thanks!

      ‘If the data is your valid IOTA address, the channel is your MAIA.’ => ‘If you store your valid IOTA address in the channel, the last message of the channel is your current valid IOTA address’. MAIA = A channel that follows this approach.

      You must not transfer IOTAs to the maia address!! (yet ūüėČ ), you must transfer them to the address stored in the MAM channel.

      Let’s assume that ADDR(seed, index) is a function that generates a address (private & public key).
      You only sign once with ADDR(mam seed,0), when you do it you publish {current iota address, ADDR(mam seed,1)}. For the next MAM message you will use ADDR(mam seed,1) private address to publish {new iota address, ADDR(mam seed,2)} and so on.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s