Dweb - web publishing, RESTful web apps, versioned data and

Well - apps need to and can be structured differently.

Since we have immutable data pointing to a single source of truth shouldn’t be an issue - right?

  • Entity Framework - I’ll assume you’re referring to mechanisms that wrap your database objects into objects in your programming language… I don’t see why pointers, registers, graphEntry, Scratchpad (and registers) shouldn’t be wrapped into objects… So not an issue…
  • Optimistic concurrency - that just reads the value before updating - right? Why would that be an issue with autonomi?
  • Autoincrementing primary keys - isn’t this a database specific issue anyway? If you add an additional entry to e.g. A linked list built from graphentries and immutable data you cannot use the same index anyway and you can ‘auto increment’ client side on writing the data…
  • Cascading deletes? If you make your data structure the way that you can invalidate the ‘entrypoint to your… e.g. Customer data’ then it would implicitly take all the child elements with it when it’s removed.

Long story short - you probably shouldn’t try to bring your database to autonomi… You should think about the data of your application, who creates what, how it interacts and then use the available data types and multisig logic (can be 1 out of n too if I’m not mistaken) to get get your data flow/access structure right :man_shrugging:

And maybe worth noting (someone pointed this out to me not long ago because I didn’t think of it) that it’s possible to e.g. Have a pointer pointing to the value of a certain register value too… So e.g. If you have a register holding a full ‘order’ with customer data, delivery address,…, order status
You can give a pointer to the order status out to your customer and he can read the state while you are able to write and update it.
The combination of multisig BLS keys and clever usage of the available data types should enable a broad variety of applications with pure client side computing involved.

I think the main difference is that “you don’t have users” with autonomi apps… “autonomi apps get used by people”..?

8 Likes

You seem to be concluding that such an app isn’t possible on Autonomi. Correct me please.

The points you raise are valid for a single-user scenario, but complexity increases exponentially when we have multiple simultaneous users, e.g. Bob in Italy is working on the same database record as Alice in Brazil.

  • Entity Framework: Yes, EF is an ORM. It connects to the configured database and does its magic. But, like the rest of our app, it relies on executing server-side logic, something which doesn’t appear to be available with the Autonomi model. Autonomi appears to be client-side only.

  • Autoincrement: We need a central authority. Without some sort of lock mechanism, which feature a database server listening on a given port provides, multiple nodes could attempt simultaneous inserts and end up with collisions.

    In a P2P system like Autonomi, where entries are propagated to peers, there’s no guarantee that two peers won’t attempt to add a new entry at the same position before updates propagate.

    Here’s a bit of pseudocode:

    Class DbKeyManager
      Function AutoIncrement As Integer
        Dim iNewValue As Integer
    
        SyncLock Me.Locker
          Db.CurrentKeyValue +=1
          iNewValue = Db.CurrentKeyValue
        End SyncLock
    
        Return iNewValue
      End Function
    
      Private Shared Locker As New Object
    End Class
    

    This code is thread-safe, since only one thread at a time can enter the SyncLock block. All other threads wait until the current thread exits. While the example is oversimplified, it illustrates the basic concept of how a database server (MSSQL, Postgres, etc.) manages an autoincrementing primary key.

    Let’s suppose we switch to a file-based database, such as SQLite or SQLCE. Again, we’re OK as long as we’re the only user: the database is local to the application and everything works fine. However, this breaks down as soon as we introduce the Bob & Alice scenario.

    Bob applies a payment and writes a record to the Invoice table. Alice does the same. Whose copy of the database is valid? We can’t do a simple file sync from Bob to Alice, because Alice would lose her payment entry.

    So the question remains: how do we achieve this with Autonomi?

The combination of multisig BLS keys and clever usage of the available data types should enable a broad variety of applications with pure client side computing involved.

I’m not following you. Could you provide a concrete example?

This sounds like a job to make great use of the upcoming transaction data type.

5 Likes

the upcoming transaction data type

That sounds interesting. Tell me more?

Do you have a link?

2 Likes

The native token will be using it. Others know a lot more of how it is being implemented so I will defer to more knowledgable people.

2 Likes

ChatGPT is telling me it can be done.

I’m not sure whether I should believe it, though… :rofl:

5 Likes

Oh well I guess for this scenario different approaches would be imaginable

One approach might be to make all changes 2 out of 2 multisig so without Alice and Bob both agreeing (syncing and signing) on all changes together no change would really be possible to even be written to the network.

But since this would be a pretty annoying solution I guess (and the communication channel for syncing and signing would need to be resolved) better solution would probably be like neo suggested the immutable graphEntry datatype (very similar to the transaction data type in earlier networks) - every additional invoice is a ‘transaction’ or graphEntry - and every graphEntry points to (the previous graphEntry and) where the next graphEntry will be stored in the network (when it will be written). Both Alice and Bob can create valid graphEntries on that address - but the network will only accept one graphEntry to be written. So when attempting to store the tx the software may want to check for writing failures&read the values once from the network. In case of a ‘collision’ (another party having written earlier than us) we can simply write to the next valid graphEntry in the chain.

Did that help?

Someone on discord shared his ai created visualisations of the 4 native data types. I think those are really nice and might help too.

Ps:

=D and there’s significantly more qualified people than me that may know smarter and better implementations :wink:

6 Likes

Thank you. That helps.

ChatGPT is telling me to remove my head from the old way of thinking and plant it in the new.

Here’s the conversation:


Describe the upcoming Autonomi transaction data type.

Autonomi is developing a new data type known as “Transactions,” designed to enhance the existing Conflict-free Replicated Data Types (CRDTs) like Registers and Multimaps. This new type will offer a chained structure, effectively replacing CRDT Registers. The primary objective is to provide a more efficient and scalable solution for managing mutable data within the network. The introduction of Transactions is part of Autonomi’s ongoing efforts to improve data storage and retrieval mechanisms.

Using this new data type, design the data storage component of an application that meets these criteria:

  1. Supports or emulates primary keys in a multi-user scenario
  2. Supports or emulates foreign key constraints
  3. Supports multi-user access, e.g. Bob in Italy applies a payment at the same moment as Alice in Brazil, both to the same invoice; each should receive each other’s updates immediately and without any data collisions

To meet the specified criteria using the upcoming “autonomi transaction” data type, we need to design a data storage system that incorporates multi-user access with real-time synchronization, primary key and foreign key emulation, and conflict-free updates in a distributed environment.

Data Storage Component Design Using Autonomi Transactions

Key Concepts

  1. Primary Keys:

    • Each entity or record will have a unique identifier, ensuring that each item in the database can be uniquely referenced. In Autonomi’s Transaction system, this can be achieved through a unique “Transaction ID” or a similar mechanism using CRDTs or other conflict-free replicated data types (CvRDTs).
  2. Foreign Keys:

    • Foreign keys, while not natively supported in many distributed databases, can be emulated by ensuring that the transaction IDs are replicated across the system for consistency. These relationships will ensure referential integrity while allowing updates to be processed asynchronously.
  3. Multi-User Access & Conflict Resolution:

    • Autonomi’s transaction system is designed to handle real-time updates and conflict resolution, ensuring that updates made by Bob in Italy and Alice in Brazil (or any other users across different locations) are processed without collision. This will be achieved by utilizing Autonomi’s conflict-free replicated data types (CRDTs) and Transactions to ensure that updates to shared data are handled safely.

Design Overview

1. Data Storage Architecture

The storage system will be divided into entities that represent database tables. Each entity will have a corresponding Transaction data type that handles updates in a conflict-free manner. For example, entities such as Invoices, Payments, and Users will be designed as separate entities with unique identifiers (primary keys) and interlinked using emulated foreign keys.

  • Entities:
    • Invoice: Represents an invoice record, including fields such as InvoiceID (primary key), Amount, DueDate, Status.
    • Payment: Represents a payment record, including PaymentID (primary key), AmountPaid, PaymentDate, InvoiceID (foreign key referring to InvoiceID).
    • User: Represents a user, including UserID (primary key), Name, Country.

Each of these entities is stored as a separate Autonomi “transaction” type with the following CRDT design:

  • CRDTs for conflict-free replication: Transactions within each entity are maintained as conflict-free using Autonomi’s CRDTs to avoid conflicts and support real-time updates.

2. Primary Key Emulation

  • Every record (Invoice, Payment, etc.) will have a globally unique Transaction ID.
  • For example, a record for Invoice will have the following structure:
{
  "TransactionID": "unique-invoice-id",
  "InvoiceID": "12345",
  "Amount": 200,
  "DueDate": "2025-06-01",
  "Status": "Pending"
}

The Transaction ID will be used as the primary key to ensure that updates to each record are applied without conflict across different users and locations.

  • When Bob updates an invoice in Italy, his transaction will be given a unique ID, and the system will replicate this transaction to Alice in Brazil in real time.

3. Foreign Key Emulation

Foreign key constraints are emulated by maintaining transactional consistency across related data types. For example, a Payment will store a reference to an Invoice by including the InvoiceID as part of the Payment record. Updates to the Invoice or Payment entities will ensure that foreign key constraints are respected without explicitly enforcing the constraint at the database level.

{
  "TransactionID": "unique-payment-id",
  "PaymentID": "67890",
  "AmountPaid": 150,
  "PaymentDate": "2025-03-31",
  "InvoiceID": "12345"  // Foreign Key to Invoice
}

4. Multi-User Access & Conflict-Free Updates

Autonomi’s transaction data type supports conflict-free data types. This is crucial for multi-user environments, as it allows updates made by different users, such as Bob and Alice, to be applied without data conflicts.

  • Versioning: Each transaction (Bob’s or Alice’s updates) is tagged with a version number or timestamp. This ensures that no updates are lost and that each user’s updates are incorporated into the system. In the case of concurrent updates (e.g., Bob and Alice updating the same invoice), Autonomi ensures that all changes are merged without loss.
  • Transaction Merging: When Bob updates the invoice and Alice simultaneously applies a payment, their changes are merged using the CRDTs’ conflict resolution algorithm. This means both updates are reflected immediately across all users without needing locking or complex conflict resolution mechanisms.
  • Real-Time Synchronization: Autonomi’s system supports real-time replication, ensuring that Bob’s and Alice’s updates are propagated to each other’s clients without delays. Using an event-based architecture, each transaction update triggers an immediate push to the relevant subscribers (in this case, Bob and Alice).

5. Conflict-Free Example Scenario

Here’s a simplified scenario where Bob and Alice work on the same invoice:

  1. Bob’s Action:
    • Bob in Italy updates the Amount on Invoice 12345 to 250. His transaction is given a unique TransactionID and committed.
    • Bob’s Payment action is also applied for Invoice 12345.
  2. Alice’s Action:
    • Simultaneously, Alice in Brazil updates the AmountPaid for Invoice 12345 and applies a payment of 100.
    • Her TransactionID is also generated and committed.
  3. Conflict Resolution:
    • Both Bob’s and Alice’s transactions are replicated to each other’s systems.
    • The system merges both updates seamlessly, preserving both the change in the Invoice (Amount changed) and the Payment (AmountPaid).
    • The system uses conflict-free merging algorithms to ensure that both updates are applied in the final state.
  4. End Result:
    • Both Bob and Alice now see the updated invoice with the new amount and the payment reflecting the combined actions. No data is lost, and both users are synchronized in real time.

Conclusion

This data storage component design utilizing the Autonomi transaction data type ensures:

  1. Primary Keys: Each entity has a unique TransactionID that acts as the primary key.
  2. Foreign Keys: Emulated using references (e.g., InvoiceID in Payment).
  3. Multi-User Access & Conflict-Free Updates: Bob and Alice’s concurrent updates are handled in real time using CRDTs and Autonomi’s conflict-free transaction system.

This architecture provides robust support for multi-user scenarios with real-time synchronization, ensuring a smooth, conflict-free experience.


I guess that about covers it.

1 Like

But I’m still trying to get my head around server-side code execution in an Autonomi web app.

For example, on Windows we have IIS, Apache on Linux. These tools execute the runtime code at the server level.

But with Autonomi there is no server. It’s static file storage only. How, then, do we create a web application (i.e. run server-side code)?

  1. The client needs to perform the computation based on available data. Nothing says that you can’t also be the client that then shares the results with your viewers/visitors.

  2. Maybe there will be a network based compute service in the future.

1 Like

well … we always claim there is no compute … and there really isn’t … but there is something else that is beyond simple file delivery/access … it’s

  1. access to certain files/information (knowing which chunks to get and how to combine them/having the private key to decrypt its content) and
  2. write-access (who is allowed to write what)

if you e.g. write an online shop for the current internet the usual customer doesn’t automatically come with its identity and you cannot trust him and let him just put his order in your database to process it later … many reasons; I’m sure you immediately have a lot of them on your mind …

on autonomi the visitor of a site does come with a wallet and can create valid signatures&data (true for native token too … without ANT no more than the classic read works) → when he comes again later he can verify his identity (that’s why you now create a user account in your shop … to get the reference to your customer) and since you know his public key you can encrypt information for him and store it even publicly that only he can read with his private key.
The user then shares with you his delivery address and you get read access to “his database” where he stores his address (encrypted with your public key; so even if anybody would know where the order is stored that 3rd party couldn’t read the content) … so other customers don’t have access to it … in your current web application you need to forbid all customers access to delivery addresses except for the orders they triggered themselves; and since it’s your database you need to change his delivery address for him (and make sure it’s really him) because it’s your one large database … so all the server side logic needed for this on the classic internet get’s replaced by simple access control/knowledge/kryptography on autonomi. Every piece of information someone needs to be able to change (delivery address, list of friends, age) needs to be modified and be in control of the person who has the authority and knowledge to change it; for all the others it’s read-only data (just as it should be) …

… shop …
owner publishes what he has to offer + prices
customer writes his order
shop owner approves the order
customer executes payment
shop owner delivers product
…there’s really no true need for server side logic (some opaque authority that can do/allow stuff) for many tasks if everyone involved has the ability to prove their identity and can create data the others can read …

7 Likes

Thanks for the questions, but I’d rather answer on a separate topic as they aren’t related to dweb’s REST capabilies but more on what can/maybe/can’t be done wrt to Autonomi.

So @moderators, please will you move posts above this reply all the way back to this one to a new topic, such as “How can Auotonomi be used to build apps which currently need business logic on a server?”.

I’ll be happy to say a little there about this, but the short answer is that for the time being you’re limited because Autonomi has no compute function. dweb and AntTP use a local server, so that can be used to help out with this, but mainly to provide access to protocols (e.g. RESTful APIs) such as Solid, rclone, WebDav. It doesn’t really provide a way to build a complex server side web application. For that you need a central server for now.

6 Likes

(locally - with my crappy router :slight_smile: )

7 Likes

New in dweb v0.3.4 for website and web app builders…

Autonomi RESTful APIs

I’m exposing dweb and Autonomi APIs using OpenAPI and a great tool called SwaggerUI. Here’s a screenshot of SwaggerUI which provides details on every API, and can also be used to test each one with the live network or a local testnet:

To open the above in your browser, install dweb and start the server:

cargo install --locked dweb-cli
dweb serve

Then in another terminal:

dweb openapi-docs

To use with a local testnet start the server with dweb --local serve and upload some websites using dweb publish-new and dweb publish-update. You can build and test web apps exactly as you would normally with the setup (i.e. running your web app using npm run dev or yarn dev etc.)

The example web apps Fileman and Names (see the OP here) make it easy to check this out too.

Developers.. help!

Please let me know if you want a particular API or if you think I’m doing it wrong. I’m starting from zero with REST API design so welcome suggestions, feedback and requests.

13 Likes

You should get over it and change you mindset; how to create an application that fills my need and does not need a server. If you find a way, you’ll get an application with practically unlimited scaleability and minimal cost/action.
Remember, the clients have also a cpu. And the amount of that cpu power increases with the amount of load :wink:

3 Likes

Pretty please @moderators (see request here)

2 Likes

Actually serverless service is not anything new. You could do that also with firebase realtime database. But with autonomi, even better :wink:

how close was this to a success ?

CONTENT UPLOADED:
3da200a9ad3356cb475651a22458223d513c7997bb98bfe66e1e253c6619564f "/PIE.htc"
173bbb090bf082838f6d0ec5da245c5af3bea09573144b1f452d90336ae2cead "/contactform/readme.txt"
c4db1f646e88127874c46f2f0435e350a8c4a4ba4f4d8820f5178af2d10b5dd1 "/css/animate.css"
7febc6dba381bd03d1962fea8b416e9e41f98b851bad2d6eeea5afe72c08e352 "/css/bootstrap.css"
d53623c7374e6a01ad40b050a28b6d6a98940ff07e3e473c4d93efdf116a9310 "/css/font-awesome.css"
98d72da5066fc2e3b0bb762b4caed9e2f238737ab6ed21119c0f49b3dccf937c "/css/responsive.css"
70b7d1e6cd8a8ff7625423276f236afab9b55ee7a3b7203eb295e2fbb0b2b01d "/css/style.css"
b6b3c1e6b8d0ff1749692cf839582436545b5a33800d02dd02cf6766366d6460 "/favicon.ico"
5eb635ccfa8f7a8c839ec54c9a6dbe562d910c7708f45781ddce99fccdf43d02 "/favicon.png"
b068cff1fd0761d7ba526c5aba31bb9229fa9fefc032d76d4f98db75c791aed6 "/fonts/FontAwesome.otf"
d5d2104be28d33194d639c73ea7d10e51810e0c1562d5a1e3e8037a0e9bc0fc5 "/fonts/fontawesome-webfont.eot"
c53b64ff08d374bfd864294b0a9e0e6732684a715c04f7f4e8a023e5a196fe37 "/fonts/fontawesome-webfont.svg"
5401ed23ece570b47853060bf4e2889646762b21e4f68ba58fbb74fc94579c07 "/fonts/fontawesome-webfont.ttf"
c87876da2d0d8165f3f6e30677f8591d938c66b8dff5c4a7a019e821fe2b408f "/fonts/fontawesome-webfont.woff"
a45b093eb7cf5f3bf1127928e9baaea22257463a30303e646bd122cda72e14bf "/img/Portfolio-pic1.jpg"
20f7c857d5eea43fbdf47f5e34d4c184d09cae2197aa0cbb17baf04b86a2b551 "/img/Portfolio-pic2.jpg"
1cd81616a12e3b21ad61111487ed803e61b13df67354654baa73f79eac4d9d0d "/img/Portfolio-pic3.jpg"
4b353bca13107fad785dacf26fbdec0e64dcc7de5a208f1b7220c1e77a656638 "/img/Portfolio-pic4.jpg"
1684c43196dfdbcd6eddf7101b174797121b30c564af4271e7e507eb70aaaceb "/img/Portfolio-pic5.jpg"
13299a2b55f6a73f330c50de0d7f9670006f551d592f74a8f20aab7fe56f0931 "/img/Portfolio-pic6.jpg"
d55f961cbdaa27f09ae73721f5fd3ffc809ccdddb2c9ff130cf6ca455d19deef "/img/bg-map.png"
84ccd28930df3dd46f4fe4fa013ad101b7392421e71abdc02624e8707642d3f2 "/img/c-liogo1.png"
84bea2d61a90d289f20f175f93e6ad2961bd5a3f236a65bf9d557e1f0c267258 "/img/c-liogo2.png"
a65677fc5a56d363421a6f85297d230a0bb39f616600dfdd58c57fabe2a5e148 "/img/c-liogo3.png"
f51643a394216eb4af74112268a80457375d0ea822f40f6f9527187097db58d3 "/img/c-liogo4.png"
fd0ea2581358c99902942a5d3385357a4709daf188f8aec610161bb07a4e0c27 "/img/c-liogo5.png"
0003c5be0e895a6d111079fa77b566aba0eea2ad4ff6a9317be1f8356ec275ba "/img/client-pic1.jpg"
7b018dd0d02bb6f62ce4ece16465518a9e058454202062427605b9dd260801bf "/img/footer-logo.png"
07e8801942cbb6508b5f30001fab29c0b128f9698e1bb3688fc83ee9682a577b "/img/glyphicons-halflings-white.png"
4819a92abfbc52c7b9a723e224c45b196a602e1c4c8ce689278e46e825892d13 "/img/glyphicons-halflings.png"
8afbb0d5f61853ed841d2bc2468a5fc84bbd605c8b525dc96f795f9d0b71874a "/img/iPad.png"
031d814bafaf6c5e111326f17b40ce47ccb9ded1f0a98f24a349b8fc64ab2295 "/img/imac.png"
4f774caf4ca88d8c6267db431d99946e92992e3c1d1a6c71af36385078fbfdc5 "/img/iphone.png"
37abe3f36db4aa56146683b96bdb49e601bcec86fd37d36f44bdf5ba067eb48c "/img/list-style.png"
bb23c0918c4921209c90ed730c8b4560e4d8da88a0615447c5a3136fe58ad3c2 "/img/logo.png"
3047c91d6102cb2161defa7279982c5ddda3211e43cd9c159122036eadddb6fd "/img/macbook-pro.png"
b1ef7f79beebc1ee615710ba9e7cbb9827a851e23de8322eef1b6844289afc0a "/img/pw_maze_black.png"
b3d23b6b370c45a05ec724459db997c81d180ee31e1874368b7d04bdc678bc3e "/img/pw_maze_black_2X.png"
4d7388b9923f297c2027976af8270b092b515ee81aba1f1637a06d05ae58d38e "/img/res_nav_click.png"
487d600eb5d2db54d382d8b6d1b2030fd5fe0c6f6e71ec40252db55ca7666067 "/img/section-bg1.jpg"
895b0af27672e1ba389291938648ab506efeb084ed56e1d8b7b52c52eda2fac7 "/img/section-bg2.jpg"
84e286ad9f4a3d2d430a37f3a52a77cdd8ae3e393c121595f64c86021e023edd "/img/small-logo.png"
7a04a7ad1ec88390391fd6566da47ee858c1560f2cab4ae0434f993636fc7ff5 "/img/team-leader-pic1.jpg"
475a9aec2c30883a65a76c4b554d2f3710f9923279f991b6ef01e33441592b65 "/img/team-leader-pic2.jpg"
f4609894efb22300eaf532658d732865c68920a8f09c96c356ed11fbe997582a "/img/team-leader-pic3.jpg"
d97ead2bac2af6cad06e0ef7710ffe0682c60d5851b788bdabaf03c5e0abd627 "/img/wp.png"
390675c5aa9911b0fa772c56c2cdd72e2c4349d41e2bdfc011da9820cc28c414 "/index.html"
f3e7929648826522e6d8b23a728d784fa33a6c65d1cc9149b4a9b843474d9a2d "/js/bootstrap.js"
38a3115787755f22fbd1e2dd4a917b40e51134d152b532c32f8b02e2b23e87c6 "/js/classie.js"
56e65bcdf8d1795f3b93730fea4df6d3274247c2a7896e90db7d892bc4746a6c "/js/html5element.js"
cb9b04d7591667d95eb8a626aa526802b45bdbe1c45993b065843b2f96720ab7 "/js/html5shiv.js"
51df43414b970a48dd639a5483692a146d8b3f6ee82463f8c71b7816bb69ef03 "/js/jquery-scrolltofixed.js"
4cb2486d07297830fb7d34603af8afcf4b4b3ea6347dab31b0a0448b5026abe4 "/js/jquery.1.8.3.min.js"
59735806141c588562ea3c7b237bb55c47919311ba0eae537b41da2f4beddce2 "/js/jquery.easing.1.3.js"
cbd57987d47b41185a5ed4cca245ccb598b2a723bb8443d3199d68c65ad1eb15 "/js/jquery.isotope.js"
5303ef636c96db398b59394e89c420a247127a7c73074e93a3ec0758647f12a6 "/js/respond-1.1.0.min.js"
5759be7afa86eb9da1487b9f96be6af00dd8d58177643d73e090b45e98c8c4fa "/js/wow.js"
4971b3d2856458c8a8ec3de1f4abd3d1a2ae620db9f2e92441856b01d0883406 "/readme.txt"
Creating History on network...
DEBUG History::create_online(13 Knight)
DEBUG create_graph_entry()
DEBUG entry_secret_key: 57bf03526d299a4d3ba65a88ae9a865e6f0bd75f53ee51f9f62417aee4ec79ee
DEBUG next_public_key : 8044c026b93cf907a0f2c8df869f5b4beea94a520369301806345c9d1abfc52e3b4081b8c9eebf2a35d9cdcd5bacdfe9
DEBUG creating GraphEntry::new(
       owner      : a7ddb192773ab609ea223008a31f572ef4493c6bbc71b996c2d0ef9d86ed335faf2f284527c051c3214b5d2b89388180
       parents    : []
       content    : ee383f084cffaab845617b1c43ffaee8b5c17e8fbbb3ad3d379c96b5b844f24e
       descendents: [8044c026b93cf907a0f2c8df869f5b4beea94a520369301806345c9d1abfc52e3b4081b8c9eebf2a35d9cdcd5bacdfe9])
DEBUG returning created next_entry graph entry with address a7ddb192773ab609ea223008a31f572ef4493c6bbc71b996c2d0ef9d86ed335faf2f284527c051c3214b5d2b89388180
       (showing GraphEntry addresses of parents/descendents)

       owner      : a7ddb192773ab609ea223008a31f572ef4493c6bbc71b996c2d0ef9d86ed335faf2f284527c051c3214b5d2b89388180
       parents    : []
       content    : ee383f084cffaab845617b1c43ffaee8b5c17e8fbbb3ad3d379c96b5b844f24e
       descendents: [8c6c70f5bfa8899c34b368f4cb43f668964fb378b570ff91c255fd7b3958febd747819425df76276df3eeaac899fd7e3])
DEBUG graph_entry_put() at a7ddb192773ab609ea223008a31f572ef4493c6bbc71b996c2d0ef9d86ed335faf2f284527c051c3214b5d2b89388180
DEBUG graph_entry_put() failed to put graph entry - Entry already exists at this address: GraphEntryAddress(PublicKey(07dd..5151))
DEBUG failed - failed to put graph entry - Entry already exists at this address: GraphEntryAddress(PublicKey(07dd..5151))
Failed to publish files: failed to put graph entry - Entry already exists at this address: GraphEntryAddress(PublicKey(07dd..5151))
Publish new cost: 0.000094006809125000 Gas
Publish new cost: 0.000000050293885716 ANT
Error: 
   0: failed to put graph entry - Entry already exists at this address: GraphEntryAddress(PublicKey(07dd..5151))

Location:
   /home/mint/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/dweb-0.3.3/src/trove.rs:220

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.

3 Likes

Very close! Was that a repeat publish-new?

If not that shouldn’t ever happen. If it was, next time you try publish-new specify a name which is different from the name of the --files-root directory.

Assuming you can bear trying again. Great to see you managed to get all those files up. I guess the retry-forever feature was a big part of that.

I’m not sure what I can do if this error was not during a repeat publish-new. If it was I may be able to handle that too but am a bit busy for a few days.

Thanks for trying this out. It helps so much. :folded_hands:

4 Likes

i messed up i repeated the upload new flag this time I am re running with update option not the new option.