Recover older versions of deltangle files

Today I present an update on Deltangle‘s versions. It’s a small improve but it adds a very useful feature.

Until now, a deltangle’s version stored the hash of a transaction of a content.

Now, a deltangle’s version stored the hash of a list of transactions. This list is stored using deltangle, so only the hash of the previous version and the difference with it are stored when a version is updated.

What allows you to do this? It allows you to recover a particular version.

To understand it, nothing better than an example.

Deltangle’s website has also been updated with the new version, so the functionality is ready to be used.

deltangle-history-versions

Note that versions are possible thanks to the use of maia, so it’s necessary to initialize a tree of MAM channels. Therefore, the creation of the first version is a slow process that could take even a few minutes, but I promise it’s worth it.

That’s all. In case you want to donate some IOTAs to support my work, send them to my donation address.

Using maia from the terminal

In the last post I presented the command to use deltangle from the terminal. In this I present the command to use MAIA.

For those who do not know what MAIA is, it is a way to use MAM in which it is always returned the last message. By making a similarity, you could see it as a variable in the IOTA’s tangle that only you can modify.

To use MAIA from the terminal do the following:

1) Install node

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs npm

2) Install the following libs

npm install -g iota.lib.js
npm install -g minimist

3) Download and decompress maia.tar.gz in <maia path>

mkdir <maia path>
cd <maia path>
wget https://github.com/trustingiot/maia/releases/download/1.0/maia.tar.gz
tar -zxvf maia.tar.gz
rm maia.tar.gz

4) Set MAIA_PATH

echo export MAIA_PATH=<maia path> >> ~/.profile
echo 'export PATH="$MAIA_PATH:$PATH"' >> ~/.profile
source ~/.profile

5) Set execution permission

chmod +x $MAIA_PATH/maia

6) Run maia

maia

maia-command

Do you want to know how to use maia? Watch the following video.

Update. How to share your public address using MAIA.

That’s all. In case you want to donate some IOTAs to support my work, send them to my donation address.

Using deltangle from the terminal

Are you a GNU/Linux user?

Do you want to save a text file in a decentralized way around the world at no cost?

If your answer to the previous two questions is ‘yes’, do the following:

1) Install node

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs npm

2) Install the following libs

npm install -g iota.lib.js
npm install -g diff
npm install -g minimist

3) Download and decompress deltangle.tar.gz in <deltangle path>

mkdir <deltangle path>
cd <deltangle path>
wget https://github.com/trustingiot/deltangle/releases/download/1.0/deltangle.tar.gz
tar -zxvf deltangle.tar.gz
rm deltangle.tar.gz

4) Set DELTANGLE_PATH

echo export DELTANGLE_PATH=<deltangle path> >> ~/.profile
echo 'export PATH="$DELTANGLE_PATH:$PATH"' >> ~/.profile
source ~/.profile

5) Set execution permission

chmod +x $DELTANGLE_PATH/deltangle

6) Run deltangle

deltangle

deltangle-command

Do you want to know how to use deltangle? Watch the following video.

That’s all. In case you want to donate some IOTAs to support my work, send them to my donation address.

Deltangle: Store and update text files in the tangle

What’s behind this silly name? Let me explain it.

Deltangle is the contraction of delta and tangle. and as it is clear from these two terms, it is a tool to store and update files in the tangle.

With deltangle you can do three things:

  1. Store a text file. In this case the content of the file is converted to trytes, divided into several transactions and published in the tangle in a single bundle. You will get a unique hash like this that will allow anyone to download the file using deltangle.
  2. Update a text file. In this case deltangle calculates the difference between the versions and stores a new file that contains this result. You will get a unique hash like this that will allow anyone to download the new version using deltangle.
  3. Control the published version of a text file. In this case, it uses MAIA to provide a fixed address to an updatable text file. You will get a unique hash like this that will allow anyone to download the version of the file that you want.

deltangle-obtain.png

As it is mentioned, deltangle updates files by storing the difference in a new bundle, so it minimizes the number of transactions required to be stored.

In addition, it uses MAIA, which allows you to create a unique address for an updatable text file. Note that the use of MAIA is managed by deltangle, so the publication of versions is extremely simple.

Do you want to try it? Do it here. It is not yet an iota ecosystem project, but I hope it will be soon 😉

Emphasize that the site is a proof of concept. This means that many things have not been tried and the page can change or stop working at any time (and, of course, after a snapshot everything will be lost unless you connect to a permanode)

That’s all. In case you want to donate some IOTAs to support my work, send them to my donation address.

MAIA 3. Fields, views and trees

I am happy to start July announcing the third version of MAIA, which comes with 3 changes: i) fields, ii) views and iii) trees.

Fields

From now on MAIA addresses are flexible and they can index multiple fields. How does this work?

MAIA 2 defined two methods, POST and GET. The interaction was as follows:

>>> POST(seed: x, address: y)
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< y

>>> POST(seed: x, address: y')
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< y'

MAIA 3 defines the same methods, although it changes the format of the call (in the POST method) and the format of the result (in the GET method). Now the iteration is as follows:

>>> POST(seed: x, data: {address: y, twitter: t})
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< {address: y, twitter: t}

Note that the fields of the channel are updated individually, performing a merge with the previous values, which allows adding, modifying or deleting fields in a simple way.

>>> // New field
>>> POST(seed: x, data: {facebook: f})
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< {address: y, twitter: t, facebook: f}

>>> // Modify field
>>> POST(seed: x, data: {facebook: f'})
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< {address: y, twitter: t, facebook: f'}

>>> // Remove field
>>> POST(seed: x, data: {twitter: ''})
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< {address: y, facebook: f'}

>>> // Complex request
>>> POST(seed: x, data: {address: '', facebook: f'', linkedin: l})
<<< {result: ok, maia: z}

>>> GET(maia: z)
<<< {facebook: f'', linkedin: l}

Views

Views are independent transactions that index a field of MAIA addresses. They provide a similar experience to the previous version of MAIA.

To use views, two methods are used:

  • createView(maia: address, field: field to be indexed, callback: callback function used in browser execution) => Transaction hash.
  • readView(view: view address, callback: callback function used in browser execution) => Field value.

The iteration is as follows:

Create a MAIA address

>>> POST(seed: x, data:{address:'my address', other:'example'})
<<< {status: ok, maia: z}

>>> GET(maia: A)
<<< {address:'my address', other:'example'}

Create a view

>>> createView(maia: A, field:'address')
<<< B // Hash of the transaction

>>> readView(view: B)
<<< 'my address'

Update the MAIA address

>>> POST(seed: x, data:{address:'my new address'})
<<< {status: ok, maia: z}

>>> readView(view: B)
<<< 'my new address'

Trees

MAIA 3 addresses use a tree data structure that allows efficient updates and readings. To understand the mechanism, nothing better that an example.

We create a MAIA 3 address.

To do this, first we connect to an IOTA node and we establish different parameters:

  • provider: IOTA node.
  • depth: Transactions depth.
  • mwm: Transactions mwm.
  • channelLayers: Number of intermediate layers to be used in the MAIA addresses.
  • channelDepth: Maximum depth of the layers.
>>> var maia = new MAIA({
        provider: p,
        depth: 9,
        mwm: 14,
        channelLayers: 2,
        channelDepth: 4})

Connected to the node, we publish the first message:

>>> maia.post(seed: x, data:{address:'AAA', twitter:'fjestrella'})

When the previous command is called, the root MAM channel is created and a configuration message is published in it.

// Root first message
// ID(=MAIA): A
// Seed_A = x
config {
    protocol: 'maia',
    version: 3,
    layers: 2,
    depth: 4
}

Next, a new channel, B, is created, being:

  • Seed_B = seed(Seed_A, 0)
  • seed(x, i) = toTrytes(SHA256(X + i)).substring(0, 81)

Note that SHA-256 is used for simplicity. Surely MAIA 4 will use Curl instead of it.

Once the id of the new channel, B, is known, a second message is published in the root channel A.

// Root channel second message
config {
    next: B
}

Indexed B is published in it its configuration.

// B channel first message
config {
    layers: 1, // A.layers - 1
    depth: 4 // A.depth
}

As B.config.layers > 0, a new channel, C, is created, being Seed_C = seed(Seed_B, 0).

// B channel second message
config {
    next: C
}

// C channel first message
config {
    layers: 0
    depth: 4
}

As C.config.layers == 0 and the number of messages in the channel (=1) is lower than C.config.depth + 1 (+1 due to configuration message) the data is published in this channel.

// C channel second message
data {
    address: 'AAA'
    twitter: 'fjestrella'
}

Once the message is created, the address of the root node, A, which is the MAIA address, is returned.

<<< {status: ok, maia: A}

A GET request would be resolved as follows:

>>> maia.get(maia: A)
  • Read to channel A and navigate to the last message (0 + 2 = 2). The address of channel B is obtained in the last message.
  • Read to channel B and navigate to the last message (2 + 2 = 4). The address of channel C is obtained in the last message.
  • Read to channel C and navigate to the last message (4 + 2 = 6). The message contains data so it is returned.
<<< data {address: 'AAA', twitter: 'fjestrella'}

As is clear from the above, the process in the first message is much slower than in MAIA 2, but what will happen with message 2, or 10, or 100 ?. Let’s check it.

I have carried out two simulations using Kiri in an Up² setting the following scenario:

  • Private IOTA testnet with 0 transactions.
  • MWM = 1.
  • Execution of the coordinator every 300 seconds.
  • Update and read the address 365 times (we simulate one year updating daily).

The results speak for themselves.

maia2-maia3.png

MAIA PoC has been updated with the latest version, so you can try the new version now.

maia3-maia

maia3-view

Emphasize that as I have always indicated, the site is a proof of concept. This means that many things have not been tried and the page can change or stop working at any time.

If you want to use MAIA in a controlled way you can download the source code from its repository. In it, the web code and some small directives for its configuration are available.

That’s all. In case you want to donate some IOTAs to support my work, send them to my donation address.

MAIA explained

Today we are launching a new website for MAIA 🙂

maia-website

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.

address-seed.png

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 ZZ=(iotas in Ai)-X, to your new address Ajj > i.

address-payment.png

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.

mam-channel.png

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.

updated-version

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

mam-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.

MAIA vanity address

What is a vanity address? An address which you choose yourself (or at least part of it).

How difficult is to generate one? Its depends on its exact structure.

Let’s assume that we want to generate an IOTA vanity address with a prefix X of length k. Each character of an IOTA address has 27 (=3³ [A-Z9]) possible values. Since the only way to find out the private key for a given address is to use brute force, and that the probability of finding an address that starts with X is 1 in 27^k (1:27, 2:279, 4:531.441, 6:387.420.489, …), it is easy to realize that the generation of an IOTA vanity address is a computationally expensive process.

vanity

If to this is added the fact that one of the characteristics of IOTA is that when an address is used to transfer IOTAs it should not be reused, it is easy to understand why there are not many articles on how to generate IOTA vanity addresses … .

In my opinion, an IOTA vanity address is not very useful, but what do you thing about a MAIA vanity address? It sounds much better, do not you think? 🙂

What is MAIA? A public MAM channel in which each message is an IOTA address and which always returns the last message. Since a MAIA is like a ‘fixed address’, generate a MAIA vanity address is not only useful but also advisable (if you want to generate a shareable address, do not you think that sometimes it’s better that it be recognizable?).

maia

I have done some tests and I have developed a small tool using the IOTA rust implementation. It is programming using Rust and I do not know how to program in Rust, so you can get an idea of its simplicity … . Why it has been developed using Rust? Because it is said that it is quite fast (I can say that Rust is much faster than JavaScript for this).

In short, maia.vanity.gen is just a proof of concept for the generation of MAIA vanity addresses and there is a lot of room for optimization. While I write this on an i5-750, I am running the generator in the background. This is the last output of the tool (4 threads):

c = 115000, seconds = 6320
c = 115000, seconds = 6377
c = 115000, seconds = 6389
c = 115000, seconds = 6393

Translation: 460.000 addresses (4 threads * 115.000) in 6.393 seconds (the slower thread), or what is the same ~72 addresses per second.

Below I show you some of the MAIA vanity addresses generated (you should be very stupid to use any of these as your personal address… )

Prefix: IOT
Seed: BONYLU9PJSMRSPBBZRFQKJEWEFBCWKFZWCEXPE9KIHUMTSRPGKQSRCQBUZVFRAIGQEQMFUIZVHOQCHBDQ
Address: IOT9PVXIATCAUNDIXUTOFECXRQT9QGNDBNBBWCNDBDRERNSDPPCJWGDDTFGASUNVBISLPMC9QSABRFMSI

Prefix: FJE // My name is Fco Javier Estrella
Seed: BHPOLCQKYXJZHZIGNHQGVHWLFCFQAYPLNMWEBRKHCPDKWFJSAWRSIYEKTNXSUXADCSMWKIKEVVXQNGILP
Address: FJE9SEOEFROKIDHIZREARZVUBVECL9ASRKMURNOGY9SUKMSGWLHKMLZFJCKWNDNLXUGUFGMXBNHPJHGXE

Prefix: FJES // Fco Javier EStrella
Seed: CGJBFDNTAZJQUKLKXVDUWGSDXZ9ZEBCXMLBIEVLNSXEPOVOJCPASUZIMTDGVBNODTUORUBMSMINKND9QA
Address: FJESJKDENQLKIEXKGQSEMFAROQSXFOFIBEXENXRM99VBCIANETONHHQQIXKBXMCELWGFYZRSFOMLITBUV

Prefix: JAVI // Abbreviation of Javier ...
Seed: XHMWMZSEEQGSQRQGRF9TNUFTBSOBULAAAQFDLTHUTSFQXU9BNCDMHYKIPMVRSXMNGJWJZDIUOVSCFHTCV
Address: JAVIVRPTDE9CSIOITQ9GBCDWOHVATXRKNENN9J9R9ZKFCOCTHCRFTSPOUPPHRPUPBJCHV9LDSHXFVZNKC

Prefix: MAIA
Seed: KFUFCZTJQEMCZTHOQPTIZUFUEANMV9LLBQAKKEDGW9WAIBGI9YSMWJNBFOFMKLAZNNLNDVFAUYELSMXIN
Address: MAIAISICOTBGKDLZJUZFQLUVVRDYZKSRTMTZFQFLZJAUHLGJFOELQUT9EQYSE9PWEPKGJVXQMPXWCFIUL

That’s all folks! In case you want to donate some IOTAs to support my work, send them to my personal IOTA address:

KIFEHFFMQDPHLHGURUXDZGTJVDZMDLCFSVXXRNXKCIXJZSJNBWULBLQXYSNZNVGIJXVCITXREHUUKCHGDCSEBGYDEB (it is no longer my address, use my MAIA)

Or better yet, send them to my new MAIA (JAVIEMISWGJ… 🙂 ) 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 :’): donation address.

run/kiri/run: Increasing the speed of Kiri

I keep improving Kiri to measure the efficiency of MAIA. Today I bring you a new short post with its latest enhancements and improvements. While in the previous post I focused on its autonomy, in this I will focus on its speed.

I am of the opinion that each project must have its identity. Therefore, before telling you about its improvements, I present you its logo:

logo

It is not very good, but at least it is quite descriptive (IRI in a box) 🙂

When we talk about improving the speed of an application we can think of several things such as remove a bottleneck, parallelize the execution, reduce order of complexity or use a new library among others things. I am sorry to disappoint those who expect an ingenious solution … .

To put you in context, Kiri is an application that allows you to running a private IOTA testnet in a Low Cost Single Board Computer (LCSBC), something that can be very useful to carry out certain types of tests.

What is not necessary to running a private IOTA testnet in a LCSBC? Neither run the IXI hub nor load the addresses of previous epochs.

run_kiri_run

To what extent does the above affect the speed of Kiri? Well, I think an image here is worth more than a thousand words.

kiri-start

kiri-size.png

I must admit that the graphs do not indicate anything about the overall speed, but the reason is simple, it is complicated to measure accurately and it is logical to conclude that (usually), if you use less computational resources the overall speed will be higher. I think it is unnecessary to develop a convoluted metric to prove it, it is only necessary to use the new version of Kiri to realize that it works faster than the previous one (at least 25%).

Any other improvement? Some other more, although most of them are focused on fixing errors and improving the integration of IRI in Kura.

That’s all. In a few days I will bring you news from MAIA.

In case you want to donate some IOTAs to support my work, send them to my personal IOTA address:

KIFEHFFMQDPHLHGURUXDZGTJVDZMDLCFSVXXRNXKCIXJZSJNBWULBLQXYSNZNVGIJXVCITXREHUUKCHGDCSEBGYDEB (it is no longer my address, use my MAIA)

Or better yet, send them to my MAIA (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 :’) ): donation address.

Increasing the autonomy of Kiri

In the previous post, I introduced MAIA, a MAM-based protocol that allows generating something similar to a fixed IOTA address.

Today, I present a handful of improvements in Kiri, which have been made to measure the efficiency of MAIA.

If you do not know what is Kiri, I just tell you that it is an application for Kura that allows you to deploy private IOTA testnets in LCSBC (it has been successfully tested in Raspberry Pi 2B/3B and Up Squared).

kiri

You can get more information about Kiri on its presentation post and download it from its repository (it includes ready-to-use packages).

The main improvements, from least to most important, are:

Added patch to use unsigned snapshots

The configuration of gitignore excluded a patch that allows using unsigned snapshots in IRI ^^’ . I am so sorry for anyone who had tried to deploy Kiri compiling it from the source code …

Integrated iota.lib.java – JOTA

Jota has been patched, so it can work on Kura and it has been integrated into Kiri. Now, it is possible to use code that is using IOTA’s API to work with our private IOTA testnet.

Self-coordinated node

A coordinator has been integrated into Kiri, so it is no longer necessary to use https://github.com/schierlm/private-iota-testnet for this. A Kiri private IOTA testnet is now autonomous.

kiri-milestone

The configuration of Kiri allows you to establish the interval for issuing new milestones by using the coordinator.

coordinator-interval.png

That’s all folks (more coming soon 😉 ).

In case you want to donate some IOTAs to support my work, send them to my personal IOTA address:

KIFEHFFMQDPHLHGURUXDZGTJVDZMDLCFSVXXRNXKCIXJZSJNBWULBLQXYSNZNVGIJXVCITXREHUUKCHGDCSEBGYDEB (it is no longer my address, use my MAIA)

Or better yet, send them to my MAIA (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 :’) ): donation address.

MAIA: Masked Authenticated IOTA Address

I am pleased to introduce you MAIA, a protocol based on MAM which allows establishing a fixed address that points to another address [http://maia.trustingiot.com/poc].

MAIA is the acronym of Masked Authenticated IOTA Address. This acronym describes very well what it is, and also sounds good when it is pronounced “MAIA” 🙂

Maybe those who are familiar with IOTA may intuit what MAIA is, but I think it is necessary to contextualize the problem for which MAIA is proposed as a possible solution.

One of the characteristics of IOTA is that when an address is used to transfer IOTAs it should not be reused, and this is good. I think the following image published on Reddit illustrates it brilliantly:

reuse-iota

Another characteristic of IOTA is that it supports cool features such as MAM (Masked Authenticated Message). In general, I could say that MAM allows you to create secure messaging channels on the tangle. If you are not sure about what is MAM or how it works, the best thing you can do is read the following blogpost.

What is MAIA? A public MAM channel in which each message is an IOTA address and which always returns the last message.

maia

Let me tell you a sad story that happened to Alice and Bob.

  1. Alice publishes articles in different blogs and in each of them she includes her IOTA address for donations.
  2. Bob finds an article published by Alice that allows him to solve a problem that has been bothering him for days. He is so happy that he transfers some IOTAs to the IOTA address included by Alice.
  3. One day Alice decides to spend her IOTAs. Before doing the above, she creates a new address and modifies the old one by the new one in all the posts she has published. Once she is sure that she has changed the address in all posts, she spends her IOTAs.
  4. After few days, Bob finds something created by Alice again, but this time it is not a blog, but the pdf of a presentation that Alice made a month ago for a conference. Alice had included in the presentation her old IOTA address which is no longer valid, but Bob does not know it. Bob is so grateful to Alice that he donates some IOTAs to her again and he transfers them to the old address since this is the one that he knows.

What would happen now? It is difficult to know. Perhaps an enough robust wallet warns and/or prevents Bob from making this transaction. Maybe Alice keeps the private key of her old address and she can transfer the IOTAs to her new address before a third person takes them. Or perhaps the donation ends up in the hands of a third person who has designed a software to scan the tangle and take advantage of situations like the previous one.

Let’s make some changes to the story so that it has a happy ending.

  1. Alice publishes articles in different blogs and in each of them she includes her IOTA address MAIA for donations.
  2. Bob finds an article published by Alice that allows him to solve a problem that has been bothering him for days. He is so happy that he transfers some IOTAs to the IOTA address MAIA included by Alice.
  3. One day Alice decides to spend her IOTAs. Before doing the above, she creates a new address and modifies the old one by the new one in all the posts she has published the IOTA address associated with her MAIA. Once she is completely sure that she has changed the address in all posts address associated with her MAIA, she spends her IOTAs.
  4. After few days, Bob finds something created by Alice again, but this time it is not a blog, but the pdf of a presentation that Alice made a month ago for a conference. Alice had included in the presentation her old IOTA address which is no longer valid, but Bob does not know it MAIA. Bob is so grateful to Alice that he donates some IOTAs to her again and he transfers them to the old address since it is the one he knows current IOTA address associated with the MAIA.

Why has MAIA been proposed? Due to the absence of a satisfactory solution for problems like the previous one. There are some solutions, but all of them fail (in my opinion) at some point. Perhaps what comes closest to a satisfactory solution is the use of IOTA cheques, but there are still points to be solved (as I understand it, the creator of the cheque could ‘revoke’ it because he/she knows the private key, and this is something that invalidates the solution in some cases).

I think MAIA is a simple and elegant mechanism to deal with situations which are similar to the previous one. As it is said before, MAIA is only a protocol that uses MAM, and maybe, it can be implemented in about 10 lines of code, so it is not a disruptive or revolutionary idea. It is just the formalization of a solution to the previous problem.

The first version of MAIA is available in its repository. In this first version, it includes a JavaScript library that can be used in both, backend and frontend, as well as some code in order to test it in both cases.

Once the praises of MAIA are sung, I will tell you the negative points.

What happens after a snapshot? Currently, MAIA’s address should be recreated, but in a few weeks, this should not happen (I can only say that the solution is related to permanodes, but that it will not be a permanode 😉 ).

Where can I use MAIA? Currently, nowhere. However, we are developing some tools to automate the use of MAIA that we believe you will like. If you want to do some test, you can do them here (it’s the code used to test MAIA, so be very very very careful with what you do).

I hope you like MAIA. In case you want to donate some IOTAs to support my work, send them to my personal IOTA address:

KIFEHFFMQDPHLHGURUXDZGTJVDZMDLCFSVXXRNXKCIXJZSJNBWULBLQXYSNZNVGIJXVCITXREHUUKCHGDCSEBGYDEB (it is no longer my address, use my MAIA)

Or better yet, send them to my MAIA (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 :’) ): donation address.