
End to End Dash Tutorial - 6a
Anthony Campolo and Rion Gull debug Dash Platform identity creation on testnet and explore Dash's dual-blockchain architecture.
Episode Description
Anthony Campolo and Rion Gull debug Dash Platform identity creation errors on testnet, exploring the architecture of Dash's dual-blockchain system and reference applications.
Episode Summary
In this debugging session, Anthony Campolo and Rion Gull work through persistent errors encountered while building a tutorial for Dash Platform identity creation. Rion provides extensive context on Dash's architecture, explaining the relationship between the proof-of-work core blockchain and the proof-of-stake platform sidechain, along with the role of masternodes, EvoNodes, and quorums in securing transactions through InstantSend and Chainlocks. After clarifying terminology around wallets, addresses, and identities, they isolate the root cause of the tutorial's failure to a single configuration variable controlling block synchronization height. The session demonstrates how changing the skip synchronization value resolves the ECDSA signing error, leading to a discussion about contributing fixes back to the documentation. They then explore the Dash Money reference application built by an anonymous developer, successfully creating an identity through its interface but discovering the codebase contains a 15,000-line class component with hundreds of client option instances, making it impractical to extract patterns directly. The conversation concludes with plans to refactor the tutorial using the working synchronization values.
Speakers
- Anthony Campolo
- Rion Gull
Chapters
00:00:00 - Setting Up the Debugging Session and Dash Architecture Overview
Anthony and Rion open the stream by recapping their progress on a tutorial that walks through wallet creation, faucet funding, and identity registration on Dash Platform. They acknowledge they've been stuck on an error during identity creation and decide to use this session to dig deeper into the underlying architecture before tackling the bug directly.
Rion takes the conversation back to fundamentals, explaining that Dash operates two distinct blockchains: a proof-of-work core chain that handles payments and has been running for over a decade, and a newer proof-of-stake platform chain based on Tendermint consensus that currently only exists on testnet. This distinction matters because most existing Dash knowledge applies only to the core chain, while platform development requires understanding an entirely separate system that operates as a sidechain.
00:03:20 - Testnet Status, Masternodes, and Network Features
The discussion moves to practical concerns about testnet reliability, with Rion pulling up the testnet status page from Discord. Anthony notes that some entries appear months old, raising questions about how current the manually-updated status information actually is. Rion uses the page to explain the categorical breakdown of network features, distinguishing between general core functionality and masternode-specific services.
This leads into a deeper explanation of the node hierarchy in Dash. Anyone can run core software, but masternodes form a subset requiring 1,000 Dash collateral to participate in Long Living Masternode Quorums. These quorums power critical features like InstantSend, which secures individual transactions in the mempool, and Chainlocks, which secures entire blocks against reorganization attacks. Rion clarifies that the chain functions without these features, but they provide additional security guarantees that Dash users have come to expect.
00:13:12 - EvoNodes, Dash Platform Components, and Identity Primitives
Rion completes the architectural picture by introducing EvoNodes, a further subset of masternodes that require 4,000 Dash collateral and run all Dash Platform components including Drive and DAPI (Decentralized API). This tiered structure means platform development happens on infrastructure that's distinct from but integrated with the existing payments network.
Returning to Anthony's original question, Rion clarifies the terminology: a wallet is the 12-word mnemonic phrase that generates a hierarchy of public-private key pairs, an address is the hash of a public key derived from that wallet, and an identity is a Dash Platform primitive that doesn't exist outside the platform context. Identities serve as the foundation for all platform interactions, which is why the registration step is critical and why its failure blocks all subsequent tutorial functionality.
00:19:14 - Verifying Prerequisites and Switching to ESM
With architectural context established, the duo focuses on debugging methodology. Rion emphasizes his goal of making documentation work in an absolute "don't-make-me-think" way, prompting them to verify Anthony meets the documented prerequisites of Node 20 and the latest Dash JavaScript SDK version 4.0.0-dev.9. Both requirements check out, narrowing the problem space considerably.
Anthony decides to convert his code to use CommonJS require syntax to match the docs exactly, hoping this rules out any module system differences. After working through the conversion and removing the type module declaration from package.json, they discuss the broader industry shift away from require syntax. The change produces a different error message about header metadata not being found during Merkle block processing, which is genuinely new and unexpected.
00:25:52 - Isolating the Synchronization Block Height Issue
The new error sends them searching for explanations, with Anthony briefly consulting ChatGPT for general guidance before they refocus on what's actually different in their setup. Rion suggests trying the alternative skipSynchronizationBeforeHeight value that was shared in Discord, which uses 99000 instead of the 875000 figure documented on dash.org.
This single change resolves the issue and allows the identity creation to succeed. Rion theorizes that the documented value references a core blockchain height that needs to align with when the latest platform version was deployed, since platform restarts are common on testnet during development. The finding represents real progress: they've identified exactly what the documentation needs to fix, even though the underlying reason why this particular value works isn't fully understood.
00:31:04 - Discussing Documentation Fixes and Client Configuration
Having identified the fix, they pivot to discussing how to contribute it back. Anthony locates the docs repository on GitHub and considers whether to submit a simple find-and-replace PR for the magic number or propose a larger refactor that extracts client configuration into its own file across all examples. The latter approach mirrors how Anthony structured his own tutorial.
Rion expresses frustration that developers should need to think about block synchronization at all, comparing it to infrastructure-level concerns like archive nodes versus full nodes that he encountered while working at QuickNode. They agree the larger refactor would be more valuable but requires writing prose explanations that don't suit live streaming, so Anthony commits to handling that work offline.
00:43:55 - Exploring the Dash Money Reference Application
The conversation shifts to Dash Money, a reference application built by an anonymous developer that Rion wants to demonstrate as a working example of Dash Platform integration. They navigate to dashmoney.io and confirm the Vercel deployment matches the GitHub repository, then briefly debate deployment philosophy. Rion expresses interest in alternatives like GitHub Pages or self-hosting, while Anthony advocates for IPFS as a more decentralized option that avoids platform lock-in.
They settle on cloning the repository locally to verify the application works rather than getting distracted by deployment concerns. Rion explains his motivation: confirming someone else's code successfully creates identities and contracts will help validate that the underlying network works, which would mean their tutorial issues are isolated to specific configuration choices rather than fundamental network problems.
00:52:01 - Running Dash Money Locally and Identity Creation Success
Anthony gets the application running on localhost and they walk through the user flow: creating a mnemonic, copying the address, requesting testnet coins from the faucet, and waiting for confirmation on the testnet explorer. The faucet website appears to hang but actually completes successfully, with the coins arriving and showing as confirming on the explorer.
The critical moment arrives when Anthony clicks to create an identity through the Dash Money interface. The operation succeeds despite some console errors, proving that the underlying network and SDK are functional and that the issue must lie in how the documented tutorial code differs from this working implementation. This validates the path forward: replicate whatever Dash Money does that the tutorial doesn't.
00:59:00 - Code Investigation Limits and Next Steps
Diving into the source code reveals the practical limits of this investigative approach. The application's app.jsx file contains 15,000 lines as a single class component with 525 console.log statements and 256 separate instances of client options being created throughout the codebase. Anthony observes that meaningfully extracting patterns from this monolithic structure would be enormously difficult.
Rion acknowledges this isn't the right path forward and suggests they continue debugging from their own minimal tutorial code instead, working with the goal of producing slim Hello World examples. They wrap up by planning future streams, with Anthony committing to refactor his tutorial with the corrected synchronization values offline before going live again. Rion emphasizes the value of streaming this work openly so knowledge isn't trapped in one-on-one Discord messages, with the conversation ending at 01:06:21.
Transcript
00:00:01 - Anthony Campolo
We are live. Hello, Ryan. Ready for some fun debugging?
00:00:08 - Rion Gull
Yeah. I mean, I wish we weren't debugging, but here we are. Might as well do something.
00:00:15 - Anthony Campolo
Yeah. Where we're at right now for anyone who's been following along with the streams is last time we were walking through the tutorial that I built out. Which gets you to create a wallet and then get some test funds in that wallet. And then when we are trying to create an identity, we're hitting a bit of an error. And actually, I would love to just get your explanation of what is the difference between a wallet and an identity and an address? Those are three things that can be a bit confusing, especially for people who've been in the blockchain world and may have certain ideas of what those words mean in a separate context.
00:00:54 - Rion Gull
Yeah, so I'll back up even further for anyone's sake who isn't already familiar with this. So in Dash, we have two blockchains. We have a— the core blockchain, which we sometimes call the payments chain. That's a proof-of-work chain. That's— everybody pretty much understands that. And then we also—
00:01:21 - Anthony Campolo
that is what is creating the currency itself. We have different computers that are mining coins, which is like running math to basically get the coin, and then that gets dispersed to the people who then use it as currency. Anyone who knows anything about cryptocurrency should understand how that works. Yep.
00:01:38 - Rion Gull
Yeah. And, um, and then in addition to the proof-of-work, uh, chain, we also have a proof-of-stake chain. And it is based on the Tendermint client, the Tendermint consensus algorithm.
00:01:58 - Anthony Campolo
Yeah, and then proof of stake is people who already have some money in the currency can basically lock that up for a certain period of time, so then use that to validate. So that removes the need to mine, although it sounds like Dash has a combination of the two.
00:02:15 - Rion Gull
Yeah, and the reason that's important is none of our— so if you know about Dash already and/or have interacted with it in the past 10 years, all you really know is the Proof of Work chain. The Proof of Stake chain is an addition. Let's call it a sidechain. There are different people, different camps with different terminology, but I'm going to call it a sidechain. And that's really only running on testnet right now and development networks.
00:02:45 - Anthony Campolo
So there's no—
00:02:47 - Rion Gull
on mainnet there's no proof of stake anything. So this is all development stuff. And so we are running the proof of stake sidechain on our testnet, and sometimes it's up, sometimes it's not. Sometimes the testnet is Typically the testnet is working for the proof-of-work chain, the payments chain, but sometimes the testnet chain is down. So actually, let me just, let me see if I have the status.
00:03:20 - Anthony Campolo
Status.
00:03:22 - Rion Gull
Okay, I don't have it in my search history, so let me, let me, I'm going to Discord and I'm going to the testnet channel. If you don't already know about this, Anthony, it'd be good for you to know.
00:03:34 - Anthony Campolo
Let's pull this up and I'll share my screen for this. The testnet channel is what I was debugging it for the last—
00:03:42 - Rion Gull
Yeah. We might as well bring that up on the screen so that people can see what we've been chatting about already.
00:03:53 - Anthony Campolo
Yeah. This is what we have been walking through. I had originally been hitting an error So I first had an error because we weren't on the most recent version of the package. So I updated that. And then there was kind of an issue about synchronizing at the right block height. So we went through that. And this is what we're currently stuck on, which is what we hit in the stream yesterday, I'm pretty sure. ECDSA signing error, signature failed verification.
00:04:27 - Rion Gull
Yeah, and what I was going to bring you here for before we get too much into that weeds, because I'm still kind of in intro mode. Yeah, go click to click the top of the testnet channel for the channel description and you'll see, um, not there in the— yeah, there you go. Yeah, click, click that.
00:04:48 - Anthony Campolo
Yeah, I used to be so fluent at Discord.
00:04:52 - Rion Gull
Okay, so here's some useful links when dealing with testnet stuff, which is what we're dealing with right now. So we've got the docs there, open that in a new tab, um, go back to Discord now.
00:05:05 - Anthony Campolo
It is okay. Yeah, so this goes back to the docs.dash.org, that's what I was—
00:05:10 - Anthony Campolo
yeah.
00:05:11 - Rion Gull
And then so when I was talking about we have two blockchains, this is what I mean. We have the— there's, there's an explorer for both of these chains. So if you open— open— go ahead and open all these links. Okay. And we'll just talk about it real briefly.
00:05:25 - Anthony Campolo
Yes, the ones we were on last time. We were messing around with Faucet last time, so that one should be familiar to people. And— oh, looks like there is something going on.
00:05:35 - Rion Gull
Yeah, so this is the one that I was gonna— I was gonna bring up just for the sake of explanation. Because this is Dash Testnet. Go back.
00:05:45 - Anthony Campolo
Oh wait, this was— hold on, it's— this is— this is November 18th though. Does that mean it's been going on for 4 months?
00:05:56 - Rion Gull
I don't exactly know. What I'll say about this, about this site, is that it's manually updated. But what I wanted to use it for now is—
00:06:04 - Anthony Campolo
yeah, the most recent ones are all from November.
00:06:08 - Rion Gull
Yeah, so you can see, you can see the major categories. If you go a little slower, if you would. So Dash Testnet. This is a network. And the network has nodes. And those nodes are running different software. Part of that software that they're running, you could categorize under Dash Core. That's what I was talking about with the Proof-of-Work chain. And you can see under Dash Core there are several subcategories. Dash General Core, InstantSend. These are features of Core. And whether certain features are working or not. So according to this status page, everything on Core in the testnet environment network is functioning. Now on the Dash Platform—
00:06:51 - Anthony Campolo
So does that mean that these— are these just like incorrect dates then?
00:06:57 - Rion Gull
I haven't really even thought about that yet, but I'm still in the Dash Platform explaining the different high-level. Okay, so Dash Platform is a different, a different blockchain. And the— but the same nodes, or actually a subset of the nodes that run the Dash Core chain, are running the Platform chain. So only a subset, and it's actually a subset of a subset. So in Dash, we have what are called masternodes, and masternodes are a subset of all of the nodes that run the Dash Core software. So anybody can run Dash Core. Both on testnet and on mainnet. But if you're, if you're doing that, then there's no requirement, there's no stake requirement to run what you might call a validator in other networks. And typically in proof of, uh, proof of stake systems, you have, uh, the nodes are called validator nodes because they're not mining necessarily. They are creating coins. Sometimes that depends on the emission schedule, but in any case, they are required to have a certain stake to be a valid validator. You have to have— that's why it's called proof-of-stake. Now, on the Dash— in Dash, you have, you have that superset of node operators running the Dash Core software, and then a subset of that is what are called masternodes. And these masternodes, still proof of work consensus algorithm, but if you're a masternode, you have to have 1,000 Dash either on mainnet or testnet. It's easy to get testnet 1,000, obviously. On mainnet, it's more expensive, and that's part of the security model. And then these masternodes are running different services. So if you scroll up a little bit, I can talk about those services. The general core, that's anybody can run that. InstantSend, Chainlocks, and LLMQ components, those are all masternode features. So masternodes are what provides the InstantSend feature and the Chainlocks feature.
00:09:12 - Anthony Campolo
So it sounds like you can kind of think of those as like higher-level APIs that are providing developer functionality.
00:09:20 - Rion Gull
Um, they're not higher-level API. I wouldn't call them a high-level API. But the masternodes, they are considered to have more authority on the chain, for example. And when they get together in these quorums, so you'll see LLMQ, that stands for Long Living Masternode Quorum. So that's even further subset of the masternodes. There's different quorums operating.
00:09:47 - Anthony Campolo
Okay, can I ask a more— can I ask a more general question then? Would the chain function at all without all of these? Like, if were these all required to get the whole system to work?
00:10:00 - Rion Gull
The chain can function without these features. So sometimes you'll see like instant locks are— instant send locks are failing. In other words, for whatever reason, the masternode quorums aren't coming to consensus about whether a transaction should be considered solidified and irreversible. And that would be a scenario where blocks can still be produced and considered valid by normal nodes on the network, but there is something that— there is a certain flag that's not set if the instant send feature is not running. Same thing with chain locks. Chain locks InstantSend is what, what secures transactions. And where you see a transaction on the network in the mempool, in the memory pool, and if, if that transaction has an InstantSend lock on it, that means even though this isn't in a block yet, this transaction, the network considers this transaction to be secure and finalized, settled. You will not be able to spend the inputs that are spending— that are, you used in this transaction for another transaction. So that secures transactions. Chainlocks is different. Chainlocks secures blocks of transactions. So it's locking the chain and saying, instead of looking transactions in the memory pool, it's looking at blocks in the blockchain and saying, hey, we just— the miner just created— miners just created a block, and we all see this block, and we consider this block to be the canonical valid block for this given height in the blockchain. And if another block comes around and says, um, I won't get into the, the details, but it's essentially saying we can't reorganize the chain and have a different block at, say, block height— I don't even know what the numbers are— 500,000 or a million or 2 million or whatever. The block height is. This is the valid block for this block height, and it cannot be reorganized. So that's what InstantSend and chainlocks are. Again, just a quick recap: InstantSend validates and settles transactions, and then chainlocks validates and settles blocks of transactions. And these are features that, that we have in Dash and have had in Dash for a long time thanks to masternodes. Master nodes being quasi-proof-of-stake because you have to have 1,000 Dash to run a master node and then be part of these quorums that do these locks and whatnot. So now if we go back down to the Dash platform side, again, this is— we're still— now we're talking again about the testnet network. This platform is not on mainnet, never has been. We're hoping that that will be on mainnet in, uh, this year, but right now it's only on testnet. And as you can see, it gives you 9 months to figure it out.
00:13:12 - Anthony Campolo
Nice.
00:13:13 - Rion Gull
Yeah, well, I mean, we've been saying this for years.
00:13:16 - Anthony Campolo
I just always think it's funny, like, uh, you know, I, I've done open source stuff. I remember with Redwood, it was always like, when's v1 coming? And we would give like, you know, a vague time in the future and then hope we got there roughly when we said we did. So I get it.
00:13:30 - Rion Gull
Okay, so back to my superset, subset, sub-sub-subset thing where we have nodes on the network, servers on the network. You have the biggest set is the set of people running Dash Core, and then you have a subset of masternodes. And masternodes can be running Dash Core, and a subset of masternodes would be a masternode quorum. And those are what kind of dictate what's happening with, with different features like InstantSend and Chainlocks. And platform— Dash platform is run by a subset of the masternodes called EvoNodes. And EvoNodes— Evolution is the name for the Evo, that's where that comes from. EvoNodes are like masternodes, but instead of just running the core services, they're also running platform services. They require a 4,000 Dash stake. So not— increased from 1,000 to 4,000 Dash stake, or collateral as it's called sometimes. And then they run all the components of Dash Platform. So you can see Dash Platform has several components: Drive, DAPI.
00:14:48 - Anthony Campolo
Yeah, and DAPI is something that, you know, that's a term that I saw a lot as I was going through the docs to create this. And that's the Do you remind me what DAPI stands for?
00:14:59 - Rion Gull
Uh, decentralized API.
00:15:01 - Anthony Campolo
That's right.
00:15:02 - Anthony Campolo
Yeah.
00:15:02 - Rion Gull
Or Dash—
00:15:03 - Anthony Campolo
are there, are there places in the docs that we should be going to while we're like running through this stuff? Because like, here's like— this is probably a better visualization of what we're looking at right now. Yep. Yeah, yep, yeah.
00:15:14 - Rion Gull
Okay, so I, I didn't really necessarily mean to get into all the architectural side.
00:15:19 - Anthony Campolo
No, this is good, this is good, because this is stuff I didn't, I didn't really know. So that was a great like primer for me for sure. And so I guess What does this have to do with the error I'm seeing?
00:15:30 - Rion Gull
Yeah, so it was important— it is important to know that there are these two different chains going on. If you don't know that, then you're going to be totally confused when you're doing Dash platform development. Because when you—
00:15:41 - Anthony Campolo
what's been useful for me though is I don't think I've ever worked with mainnet. Because basically you started me off with Dash platform. It was like, run from here. So I've only ever existed in this world. So I didn't even know there was a whole I knew there was because I've been paid in Dash, obviously, and I own Dash. So I knew there was a separation there, vaguely, in my head. So this is a good explanation of where that separation actually exists.
00:16:05 - Rion Gull
Yeah. Yeah, so I don't know exactly what question got this line of thinking started, but you asked a question.
00:16:11 - Anthony Campolo
Can you—
00:16:11 - Rion Gull
do you remember what it was? And maybe we can circle back to it at this point.
00:16:15 - Anthony Campolo
Sure. Well, basically it was like, what does the error I'm seeing mean? Was kind of the main question, I guess. For me. So just to give people, um, I have a little repro here of what's going on. The actual function we're trying to run is— oh wait, sorry, I do remember now. I was asking what the difference between a wallet and an address and an identity is. Exactly.
00:16:38 - Rion Gull
Okay. Yeah, so wallet is a bit of an ambiguous term. You'll get different answers from different people, but from my perspective, and since the industry has already moved this way for the most part. A wallet is the 12-word phrase, um, that generates a hierarchy of addresses.
00:16:59 - Anthony Campolo
Yeah.
00:17:00 - Rion Gull
And so that's the— that's two of those terms. Wallet, I consider the 12-word phrase that can generate lots of different public-private key pairs, including addresses, which is the hash of a public key.
00:17:13 - Anthony Campolo
And so that's where we started with. We start with running this create wallet function which gives you a mnemonic and an address. So the mnemonic is the wallet, which is what you're referring to right now.
00:17:23 - Rion Gull
Yes, and then there's the address. The identity thing is the thing that got me going into the big architectural sub-explanation.
00:17:33 - Anthony Campolo
Yeah, so it says here they serve as the basis for interactions with Dash Platform. So do identities exist outside of Dash Platform? No. Okay, now I see why you needed to go through that whole thing. Sorry, what were you saying?
00:17:49 - Rion Gull
Yeah, identities are a Dash platform primitive. It is the basis of all work on Dash platform. So if you want to participate in Dash platform, one of the first things you have to do is give yourself— have the network give you an identity. And that's what these RPCs are doing in— let's see, in this— yeah, client.platform.identities.register is— and when it says client, so what is client? Client is the thing that's contacting with its configuration, contacting Dash platform nodes.
00:18:30 - Anthony Campolo
And let me actually real quick, let me go to my tutorial because I have an example of what it spits out when this actually does run.
00:18:42 - Rion Gull
So, and while you're saying that, I have to correct something that I said. I said client was something that contacts the Dash platform nodes. It's actually— that was actually probably one level deeper. The client actually can do— can request information from the core blockchain as well. So that's why there was that sub that subnamespace of client.platform and client.platform is what's giving you the options of the other things.
00:19:14 - Anthony Campolo
This is my code here. It's basically the same, it's just slightly destructured differently. But when you run it and it works, what you get is this identity ID, which is just a bunch of random characters basically.
00:19:29 - Rion Gull
And so this is what we're looking at right here is, is our work from several months ago, like maybe almost a year ago.
00:19:36 - Anthony Campolo
You did— yeah, this was, uh, you pasted it. Yeah.
00:19:41 - Rion Gull
So this was working code. And what we're doing now, high level, is we're kind of going back to this. You didn't have the tutorial completely written, or at least, um, published.
00:19:52 - Anthony Campolo
It wasn't completely written, but up to this point it was working. So it's like, that's why you can see here, like, I was able to get an Identity ID, which then was able to get me to creating all the other stuff. Like, you eventually— then you register a name. And then at that point, I had, like, actually created one. The retrieve name one, I never got working. But that's a separate matter. So, basically, I had got it working all the way up to the point I had a name created. Like, it was ajcwebdevtest or something. So, this code was working at some point. And then I just got this repo spun up. And I literally just copy-pasted the exact code that was in the in the register and identity here. So basically this sounds like we need to bump this upstream to see kind of what the error is, because as it's written in the docs, I'm currently trying and still hitting that error.
00:20:43 - Rion Gull
Yeah, okay. So at this point, um, yeah, we're, we're now at the point where we've described the, the context and we're trying to get the tutorial back to a working condition with— there's been lots of changes. For Dash platform since this original tutorial was originally written. So we're trying to get it to work again. And I personally, my goal is that the docs always work in an absolute don't-make-me-think way. And so if something's not documented, we need to make an issue for that. And my first question is Do we need to— if we scroll up to the top or to the beginning of this tutorial on Dash.org, does it document the minimum requirements and do we meet those minimum requirements for the version of Node that we're running? So it looks like it does require Node version 20. So that's my first question is, are you running Node version 20?
00:21:47 - Anthony Campolo
Yeah, 20.12.0.
00:21:49 - Rion Gull
Okay, so that's met.
00:21:51 - Anthony Campolo
Um, dash, the dash JavaScript SDK, uh, that's what we were going back and forth with, uh, to make sure we were on the right version. So right now I had originally been trying on 3 dot whatever, but now this is around 4.0.0 dev.9, which is the most—
00:22:08 - Rion Gull
which is the latest release that I know of.
00:22:10 - Anthony Campolo
That's the latest thing.
00:22:11 - Anthony Campolo
Yeah.
00:22:12 - Rion Gull
Um, there may be other— I'm, I'm looking at my GitHub. Notifications just to make sure.
00:22:21 - Anthony Campolo
That does look like the latest release. And actually, it has it the way it's written here. I just want to see what this is actually going to do because I didn't run it like this. So if I were to remove this dependency and then install it like this, let's see what happens.
00:22:36 - Rion Gull
Let's see what happens. Because you had a.9 there, and who knows if that's I think what this is going to do is this is kind of like running at latest.
00:22:49 - Anthony Campolo
Yeah.
00:22:49 - Anthony Campolo
But they have it in their own kind of weird bespoke way. So, yes, that is like running at latest and it just gives me exactly what I already had there. So, that's good. Nothing wrong there. Yep. I guess the only thing that might be different is I have ESM instead of require. So, I guess I should probably get that changed just so we're like absolutely like line for line exactly the same.
00:23:14 - Rion Gull
Yep. Yeah. Do you know offhand what version of Node gave ESM support?
00:23:27 - Anthony Campolo
A long time ago. Either 16 or 18 for sure. So, that's not an error. That's not necessarily an issue. The thing that happens is it makes like— so, I have to go back and now remove type module. From my package.json for this to actually work.
00:23:43 - Rion Gull
And, um, while you're doing that, I'm gonna go get a drink, uh, water.
00:23:47 - Anthony Campolo
So yeah, I need to get .env back in ESM version, which I haven't done in a while. Okay. I believe it's going to be this require dotenv.config instead of that. Worst comes to worst, I can go off screen and just hard code the numbers as well. Let me close all these up. OK. Okay, that should be good. And then now this needs to be— let's see, hold on, I know what to do now.
00:24:56 - Anthony Campolo
I'm going to hop off screen just real quick because I want to get my ChatGPT up and want to make sure my message history is not showing.
00:25:04 - Anthony Campolo
Okay.
00:25:05 - Rion Gull
Um, okay, that's good. Yeah, I'm hoping this gives us the same error because that would be—
00:25:12 - Anthony Campolo
it should.
00:25:13 - Rion Gull
Yeah, to me that, um, the import syntax would change the functionality.
00:25:19 - Anthony Campolo
Yeah, definitely should not. So this is probably— it's a good thing to just find that.
00:25:23 - Rion Gull
And if so, you know, part of what we could do either off stream or on stream is update the docs. Because tell me—
00:25:32 - Anthony Campolo
it would be nice to get it in ESM.
00:25:34 - Anthony Campolo
Yeah.
00:25:35 - Rion Gull
Yeah. It seems like the industry has moved on from require syntax.
00:25:41 - Anthony Campolo
They're trying their damned hardest. Let me put it that way.
00:25:44 - Anthony Campolo
Yeah. Okay. I think that is all.
00:25:52 - Anthony Campolo
Let's just see what happens now when we run this guy.
00:26:00 - Anthony Campolo
Oh, yeah.
00:26:04 - Anthony Campolo
I was—
00:26:07 - Anthony Campolo
so, make sure—
00:26:09 - Rion Gull
which happens a lot, doesn't it?
00:26:10 - Anthony Campolo
Corrects my work over here as well. Yeah, it's the— because you have the imports and the exports. It's just I haven't done this conversion backwards in so long. I've always done it forwards, you know?
00:26:20 - Anthony Campolo
Mm-hmm.
00:26:25 - Rion Gull
And we're on step 1 of the Dash.org tutorial, right? So it might make sense to just like copy it straight up exactly from the Dash documentation.
00:26:41 - Anthony Campolo
Yeah, the— yeah, so I guess the big— the difference is you don't have a separate client file. So, let me go ahead and do that.
00:26:51 - Anthony Campolo
So, I need to go to here and register. Yeah, so, I'll just copy this whole thing and then—
00:27:07 - Anthony Campolo
I could run it actually hardcoded, but I feel like I probably should do that off screen so no one messes with— because you gave me, you gave me so much test Dash, I feel like it's valuable now.
00:27:21 - Rion Gull
Yeah, I mean, I'd like to think nobody's, yeah, stealing testnet coins. That's silly.
00:27:28 - Anthony Campolo
But yeah, right, yeah, let me just Real quick, I will pop it in and just like scroll, scroll down just so no one messes with it.
00:28:04 - Anthony Campolo
Okay, so now I'm running it and we will see what happens. Drum roll.
00:28:29 - Rion Gull
Do you want to drop a link to the tutorial in the chat just so that people can Sure. Both the Dash.org one and your GitHub one.
00:29:11 - Anthony Campolo
Ooh, that's an interesting one. It's now slightly different.
00:29:18 - Anthony Campolo
Header metadata was not found during the Merkle block processing. That is not an error I have seen at any point. That we've been doing this. So, maybe kicking back to require did do something different.
00:29:38 - Rion Gull
Let's see.
00:29:44 - Anthony Campolo
Okay. So, that is interesting.
00:29:47 - Rion Gull
That is really interesting.
00:29:53 - Anthony Campolo
Oops.
00:29:56 - Rion Gull
I'm also just playing around with the StreamYard thing.
00:29:58 - Anthony Campolo
I see.
00:30:02 - Rion Gull
Copy. Okay. So, now I'm finally getting around to looking at this error here.
00:30:15 - Anthony Campolo
Oh, let me actually— I think I— hold on, I think I did something wrong, I think. Because I think I only halfway did the environment variables. Or no, actually, no, it says testnet here. Okay, never mind, that's not what I thought it was. Okay, so yeah, I'm not sure.
00:30:32 - Rion Gull
Okay, let's look at the screen again.
00:30:44 - Anthony Campolo
So my first thought always is to just see what ChatGPT has to say about it. Usually with very bespoke errors like this that are like specific to a project, it doesn't really know what to do, but it might give us some useful insight.
00:31:04 - Rion Gull
My first inclination is to read it and see if I did read it.
00:31:08 - Anthony Campolo
Now I know what it means, so I've already read it.
00:31:13 - Rion Gull
I just, I hadn't, but I trust you have.
00:31:17 - Anthony Campolo
But so I guess the question would be, what does the header metadata have to do with the Merkle block processing? Which is like a question I cannot possibly answer with my current knowledge of the chain.
00:31:27 - Rion Gull
Let's see, where is it coming from?
00:31:34 - Anthony Campolo
Um, what, so it's just, it's just coming from trying to run create identity.
00:31:40 - Rion Gull
No, I mean, so wallet lib, I'm just looking at the stack trace.
00:31:44 - Anthony Campolo
Yeah, gotcha.
00:31:49 - Rion Gull
gRPC looks like this. I've seen, I've seen gRPC errors a lot, more than I'd like to.
00:32:11 - Anthony Campolo
This error typically indicates a problem related to blockchain data synchronization or integrity when using Dash's wallet libraries. Can occur for several reasons: network configuration, wallet configuration, node connectivity, dependencies. Yeah, most of the stuff we've already tried. Yeah, what I want to— what I want to get stuff done.
00:32:31 - Rion Gull
Here is not necessarily debugging it, but just making sure that we've met the prerequisites for—
00:32:43 - Anthony Campolo
Yeah, all it is is the Node version and the dependency version. Those are the only requirements included in the docs.
00:32:49 - Rion Gull
Then you just copy and paste it.
00:32:51 - Anthony Campolo
You just copy and paste the code. Absolutely. Yeah, exactly.
00:32:55 - Rion Gull
Expand the line 17, the client options.
00:32:59 - Anthony Campolo
Yeah, that's where my mnemonic is.
00:33:01 - Rion Gull
Okay, so we got, we got a testnet network, we got a wallet that has valid mnemonic, and we— and then is this skip synchronization before height? Was that part of the tutorial, uh, the docs?
00:33:18 - Anthony Campolo
Yes, so that's in the docs. Yeah, the one we were given in the Discord was slightly different. Do you want me to try that one as well?
00:33:27 - Rion Gull
How was it different?
00:33:29 - Anthony Campolo
It was a different number. Like, it was different.
00:33:32 - Rion Gull
Yeah, same API but different number.
00:33:35 - Anthony Campolo
Yeah, it was 99000 instead of 875000.
00:33:40 - Rion Gull
Okay, let's see what happens.
00:33:43 - Anthony Campolo
I'm— hopefully it'll do basically the same thing.
00:33:54 - Rion Gull
That warning, by the way, that you see there, that's, that's been there for a long time. And I—
00:33:58 - Anthony Campolo
yeah, that, that one shows up for the commands that even work.
00:34:02 - Rion Gull
This looks like it was a success.
00:34:05 - Anthony Campolo
Hey, look at that. So that's what needs to be updated in the docs then.
00:34:11 - Rion Gull
Well, that, and I, I want to know what, why, what, what difference is that making? Because it's Obviously it's just changing what, what block it starts synchronizing at. And my guess is that it needs to be after the latest version was deployed or something like that. Let's see, only sync from mid-2023. That's what the 9—
00:34:39 - Anthony Campolo
900. No, that's, that's not— that's where we got two things going on here. That's from this. When he gave me that, he just had a number saying this.
00:34:49 - Rion Gull
And my guess is this has to be a reference to that core blockchain, uh, height, not the platform blockchain height, because platform gets restarted all the time on testnet. When, when the, when the DCG devs, um, make a new release, sometimes that requires them to basically start the, the platform blockchain over again from, from zero. So there's no way that it's getting up to that height that fast. So I'm guessing that that's referring to a block, a core height. But, um, I'm just going to open Insight and see if that's in the realm of Insight.
00:35:31 - Anthony Campolo
Okay, while you're doing that, I'm going to basically go back to my original code and then do that with the correct config and make sure that still works.
00:35:41 - Rion Gull
Yeah. Oh, and I need to, I need to look at this on the testnet. Testnet Core Explorer. There we go. And here, here's our familiar SPV client error that we saw before.
00:36:20 - Anthony Campolo
Sorry, what does that mean?
00:36:21 - Rion Gull
Uh, well, it's not— I, I'm just saying, I've— this is an error that we've seen before, this, uh, empty SPV chain. Have we not seen this? I haven't seen this yet. Was this not the error that you ran into earlier? I noted that it was something related to SPV.
00:36:39 - Anthony Campolo
Interesting. Let me see.
00:36:44 - Rion Gull
Yeah. You said—
00:36:49 - Anthony Campolo
Right.
00:36:49 - Rion Gull
Yeah.
00:36:50 - Anthony Campolo
It's a different error, though. This was chain contains orphan chunks. That was the previous SPV error, whereas now it says empty SPV chain. So it's not quite the same error.
00:37:00 - Anthony Campolo
Okay. Hmm.
00:37:03 - Anthony Campolo
So I'm not sure what is up with that.
00:37:07 - Rion Gull
@-evo/-spv. spvchain.js. Yeah. And once again, like, I don't want this to be like a big debugging session necessarily.
00:37:26 - Anthony Campolo
But yeah, I just want to know these things because I might need to go back and basically retrofit my tutorial to make sure that it works. I want to see where it works and where it doesn't with what the code I've currently got, you know.
00:37:42 - Rion Gull
Yeah.
00:37:44 - Anthony Campolo
It would be a huge lift, I don't think.
00:37:46 - Rion Gull
So, and we are— are we back to— looks like we're back to import statements if I'm not mistaken.
00:37:54 - Anthony Campolo
Um, seems like it.
00:37:55 - Rion Gull
Yeah, no, like you changed it. Did you change it back?
00:37:59 - Anthony Campolo
Yeah, yeah. So yes, so, so the code I've got in my example is using ESM. Yeah, so basically, and I've got it separated with a client in one file that needs to be imported, and then that itself is using ESM to import the Dash library and the .env. So there's kind of a— so I want to walk this back, I would take out the .env and then I would take out the require— the import statements for require to try and narrow it down.
00:38:24 - Rion Gull
Yeah. So what we found out—
00:38:25 - Anthony Campolo
that's something I can do offline.
00:38:28 - Rion Gull
What we found out then was that it wasn't changing it to require that fixed things, it was changing—
00:38:35 - Anthony Campolo
Correct.
00:38:36 - Rion Gull
Sync one.
00:38:37 - Anthony Campolo
This is all we had to change. This single variable was what was breaking it, yes. So for the actual docs where they need to be fixed, this number needs to be updated and then this example works as written.
00:38:49 - Rion Gull
Okay, now let's— I'm going to put you in, in the developer's seat where, because partly because I don't know the answer to this question, this isn't just a true thing, but let's say that you want to help out and create an issue. Do you know where to do that?
00:39:08 - Anthony Campolo
Are the docs right here? So I clicked GitHub here and then there's docs.platform, which is this. So, okay. This is what I would assume is where we would wanna open the issue.
00:39:20 - Rion Gull
Yeah. And I, I would probably say, mm, maybe even move straight to a PR instead of an issue.
00:39:26 - Anthony Campolo
Yeah, exactly. Cause I already know what needs to be fixed, so I would fork it, um, push the change and then do you want me to go through that process right now or do you wanna call it here and maybe do that offline? Um, cause literally just be just normal fork, open PR. Someone's gonna have to do it.
00:39:44 - Rion Gull
I think we should do it right now.
00:39:45 - Anthony Campolo
Okay.
00:39:46 - Rion Gull
It's not a big one. That's like, that's the least, you know, that's a very simple change.
00:39:52 - Anthony Campolo
So I can even, I can even do this. I can do this straight through the GitHub UI.
00:39:57 - Rion Gull
Yeah. So just in case other developers are watching this and, you know, want to go through the same process, then they'll at least be able to see this, you know, how to do it.
00:40:11 - Anthony Campolo
So I guess here, here's the question though. If I'm updating it in this one place, this is a single— this, I think this is going to be in all of them.
00:40:21 - Rion Gull
Yeah.
00:40:22 - Anthony Campolo
And honestly, so like, so for this, this is also why I think having your client ops in its own file that is separate from every single example is useful. For this, this is an exact example of why I keep mine separate in its own file.
00:40:36 - Rion Gull
Yeah, exactly. So that, that would be a bigger PR that we probably wouldn't want to do on stream, but that might be a worthy PR because of that exact thing. I'm also—
00:40:47 - Anthony Campolo
here's my question. So there's two things I could do here. I could basically do a control-find for every example of this and replace them all and do a PR for that, or I can propose the larger change of extracting out the client into its own section.
00:41:03 - Rion Gull
Yeah, um, I think that it would probably make— how many times does this occur?
00:41:09 - Anthony Campolo
Let's— is it every Every single one of these examples has the client in it.
00:41:14 - Rion Gull
Let's propose the change that separates it out like your tutorial, because I think that is the better way to go.
00:41:21 - Anthony Campolo
Okay. For that, I'm going to have to actually write that out in human language. I don't think that's the best use of our time to do that.
00:41:28 - Rion Gull
Probably not the best, probably not a good stream thing. You're right.
00:41:30 - Anthony Campolo
Yeah. But I'm happy to do that right when we get offline.
00:41:35 - Rion Gull
I don't know. To me, that client option should not break anything. Like, just— I'm not—
00:41:44 - Anthony Campolo
that's the control. That's where— no, no, no, because that's where it actually connects to the chain. That's the most important part.
00:41:51 - Rion Gull
Yeah, yeah, yeah. I'm actually walking that back now because that is where the, the, uh, the, the new—
00:41:57 - Anthony Campolo
like, that's where I'm doing most of my debugging when, when stuff is broken. Even thinking back to last year when stuff would be broken, the first thing I do is go to the client, make sure I got my right mnemonic, make sure I'm synchronized with the right part of the chain. So really having, having to sync with a certain part of the chain to get to work or not. That's like, that's the fundamental problem that needs to kind of be worked out here.
00:42:18 - Rion Gull
That's kind of what I'm saying is it, to me, it doesn't seem like the developer should have to worry about that.
00:42:26 - Anthony Campolo
Yeah, it's a very high-level thing that has to do with the idiosyncrasies of the chain itself. And then like, why would you need to sync to this part of the block and not another? This type of thing you usually don't have to think about with other chains, you know.
00:42:40 - Rion Gull
Exactly, yeah.
00:42:42 - Anthony Campolo
And I guess I— well, let me correct that. This is something that I do know has to be thought about, but is usually thought about at the level of the infra, not the developer. Because I remember when I worked at QuickNode, there were specific chains that would give you the full history and then cheaper chains that gave you part of the history.
00:42:58 - Rion Gull
Yeah, the archive nodes versus the full nodes.
00:43:01 - Anthony Campolo
Exactly.
00:43:02 - Rion Gull
And this is only a testnet issue. This probably wouldn't happen on a mainnet, but it is still a little bit annoying. Um, because when I looked at that option, the first thing I thought was this just helps speed up synchronization.
00:43:18 - Anthony Campolo
And that's what I thought too. Yeah, it should just make your commands run faster. But as we're seeing here, it actually is a functionality issue.
00:43:26 - Rion Gull
Yeah.
00:43:27 - Anthony Campolo
Okay. Okay, well, we learned something. I think we— I think we made progress here.
00:43:32 - Rion Gull
Progress. And I think, um, we, we ran into errors again. Do we— we could go back and we could try to, try to debug that next error with the SPV if we really wanted to, because according to like Dash Money on the Discord, he's not running into errors that we're running into, and I don't know why.
00:43:55 - Anthony Campolo
And is he using the SDK?
00:43:58 - Rion Gull
Yeah, so one thing that we could actually move on to is depending on how much time you got, you have, and how much time we want to spend on this.
00:44:06 - Anthony Campolo
Yeah, infinite time. I'm unemployed, remember? Okay.
00:44:10 - Rion Gull
No, you're employed. You're employed with Dash right now. Right. As loose as that term is. But I think it would probably be a useful exercise to try to get Dash Money's site up and deployed.
00:44:27 - Anthony Campolo
You're talking about the Vite repo he dropped?
00:44:31 - Rion Gull
Yeah, because I don't think that's ever been shown on a stream. I know.
00:44:34 - Anthony Campolo
Here's the problem though. I looked at that and we need a working identity ID to get that working first, which actually I guess we got.
00:44:44 - Rion Gull
No, his code should do that for you.
00:44:48 - Anthony Campolo
Okay, well then whatever difference is in his code. I'm remembering we did fix the issue eventually, so we did actually end up with an identity ID, so we should be good.
00:44:55 - Rion Gull
The first thing that we should do is let's go ahead and pull up a web browser and then go to his site. I want to highlight this because it's one of the only—
00:45:04 - Anthony Campolo
I didn't know this. So this is very— it looks like this is only about 3 months old anyway. So this is something that was built that was very similar in terms of like adding a React front end is kind of what I'm assuming.
00:45:16 - Rion Gull
Yeah, well, yeah, he even has a cool applications on here and this is great.
00:45:21 - Anthony Campolo
This is super cool.
00:45:22 - Rion Gull
That link that you just clicked though, go back there because I want to make sure I want to look at that URL. Dashmoney.io Vercel app. That is not the app that I know of, and I don't know which one's more up to date. So maybe he might have to update his metadata on this.
00:45:38 - Anthony Campolo
Do you have a link for the one you know of?
00:45:41 - Rion Gull
Yes, I think it's, uh, dashmoney.io. Dash dot or just, just dashmoney.io.
00:45:51 - Anthony Campolo
Okay.
00:45:53 - Anthony Campolo
Oh, it looks like this. Oh, okay. So this is just the Vercel link that goes to dashmoney.io. It's the same thing. It's, um, what's happening here is the GitHub has a link to the Vercel deployment, and then on your Vercel account, someone has mapped this domain to the correct one.
00:46:11 - Rion Gull
That could be it, but, um, that's most likely what it is.
00:46:15 - Anthony Campolo
Uh, but I'm pretty sure that's what's happening.
00:46:20 - Rion Gull
Okay. We could maybe check his GitHub Actions or something to see if there's any—
00:46:25 - Anthony Campolo
we would check his deployments right here.
00:46:27 - Rion Gull
Yeah, that's what I meant.
00:46:29 - Anthony Campolo
That's going to here.
00:46:31 - Anthony Campolo
So this is also the longer URL. Yeah, yeah, yeah. That's what's happening. Cool. So do you want me to put my account login here?
00:46:41 - Rion Gull
Well, no, I don't want to use the app necessarily. Well, I guess we could just to to demo to people what we're dealing with, what we're working with, and what we're going to spin up. I want to have you clone it down and then launch it as your own.
00:46:56 - Anthony Campolo
Let's do it. Let's make sure we're going through the README.
00:47:05 - Anthony Campolo
So, it says first copy the repository.
00:47:09 - Anthony Campolo
Connect to copy.
00:47:13 - Anthony Campolo
Yeah. So, he's saying here he uses Vercel. Add environment variables and domain name to hosting service. Yeah. This is giving you like the full instructions in terms of if you actually want to deploy this thing as well. And then these are the four—
00:47:26 - Rion Gull
That's exactly what we're trying to do. So, he's got good documentation. That's good.
00:47:32 - Anthony Campolo
Okay. So, we need to—
00:47:36 - Anthony Campolo
yeah. So, one thing I would recommend is having a .env.example file. That you could basically copy this from.
00:47:43 - Anthony Campolo
Mm-hmm.
00:47:47 - Rion Gull
Yeah. And in our deployment, I don't know if you have a Vercel account or if you want to do that, but I actually would almost prefer to try to get it working without a Vercel account because in theory these environment variables, like, I know this is— deployment is a tricky topic.
00:48:11 - Anthony Campolo
Deployment, if you wanted to actually, I could get you a decentralized frontend if you really want one. I could do that. It would be a lot more work than getting it on Vercel, but I know how to do that.
00:48:23 - Rion Gull
No, I'm not, I'm not necessarily talking about decentralized frontend like IPFS versus Vercel. I'm just talking about, um, this is a simple, this is a, uh, this is a single page application. Using React and we should be able to just deploy it through GitHub Pages, for example.
00:48:44 - Anthony Campolo
I guess, but then you need a GitHub account.
00:48:50 - Rion Gull
Yeah, I mean, we could do it in different ways. So if you have a Vercel account and you want to do that, then let's, let's do that. Yeah, I guess I just don't like, I don't like applications that depend on a platform.
00:49:03 - Anthony Campolo
But you're depending on GitHub though. So is that just you already have to depend on GitHub? So I guess it still removes the I just gave GitHub as an example. But we'll be— so then I'm asking you that. Yes. Your own— what's, what's DPS?
00:49:19 - Rion Gull
VPS, virtual private server.
00:49:22 - Anthony Campolo
Yeah, but that's, that's not simple.
00:49:25 - Rion Gull
I know.
00:49:26 - Anthony Campolo
And then you're doing that. You mean most people who would do that, they would use Amazon, you know, so then they're creating an Amazon account. It's like you're literally talking about racking your own server Like, I guess you could technically do that, but like, who realistically is going to do that?
00:49:42 - Rion Gull
Yeah, it doesn't matter really to me. I just, I wanted to discuss it a little bit because it is a, it is one of those things where, like, we were talking about this a few days ago in the Dash Discord because somebody had, One Time was his name, he had an idea for an application of building like a poker app that was decentralized.
00:50:08 - Anthony Campolo
And yeah, we talked about this last time.
00:50:11 - Rion Gull
Yeah, yeah. And it is a rabbit hole that we probably don't want to go down. Let's, let's do one thing at a time.
00:50:18 - Anthony Campolo
Yeah, I mean, yeah, deployment, it's its own, it's its own subject. And Joe, like, and like, I, I, I think this is interesting. And like, I've worked at deployment companies, so like, yeah, this is something I feel like I have a pretty good handle on. So that's why my brain first goes to IPFS, because that's like that. You're not creating an account. Like, that is something where it is basically you could just spin up a CLI and hit it and like get a URL with a deployed thing. So I think for what you want, that makes the most sense from, from my brain.
00:50:47 - Rion Gull
It's not what I want. It's what I think it's what some people think is necessary to have, uh, yeah, application.
00:50:54 - Anthony Campolo
Yeah. And I think that's great. And there's a reason why I went through the process of learning how to do that a while ago, because I do think it actually makes a lot of sense to not have to depend on a Vercel I just think using a GitHub Pages, to me that's in the same ballpark as using a Vercel.
00:51:09 - Anthony Campolo
Yeah.
00:51:09 - Rion Gull
Yeah.
00:51:09 - Rion Gull
Okay. So one thing at a time. Let us do it, um, using Vercel since that's already documented. And then after our discussion on Monday, let me go back then.
00:51:21 - Anthony Campolo
I'm gonna fork this first then since we're actually gonna deploy this. Sure.
00:51:24 - Rion Gull
Yeah.
00:51:25 - Anthony Campolo
Yeah.
00:51:26 - Rion Gull
Monday we're gonna be talking on Incubator Weekly. We're gonna be talking about IPFS among other things. So maybe after that we can then do this, get this process again, uh, and, and host it on IPFS and then compare and contrast and discuss. But for now, yeah, we'll just—
00:51:45 - Anthony Campolo
yeah, it would be, it would be an interesting exercise. And really it's the type of thing where your README could just give a couple options, be like, if you want to do this, do this, if you want to do this, do this, and then you can kind of leave it up to the user, you know. Yep. And then I think that's the way to go.
00:51:59 - Rion Gull
While you're doing this, I have a few other things to say just for context. So what we're doing now is we are cloning down and we're going to deploy the Dash Money application to our own URL that we would then, we would control this application. And the reason that we're doing this right now is I want to, I want to get his code up, up and running to show us that he's actually getting— his code is, is working. Or maybe it's not, um, but his code is theoretically working, uh, to get identities and come making contracts and all the stuff that was, was in our tutorial. It is actually working for him. So let's look at what different options he has, or Maybe we find out that this doesn't work for us either, and that there's something else that's preventing us from getting it to work. But yeah, if we can, if we can get his up, then in theory, we should be able to get our tutorials working as well.
00:53:10 - Anthony Campolo
Okay.
00:53:11 - Rion Gull
Okay, so we're already on localhost. This is great.
00:53:16 - Anthony Campolo
Should I try and log in?
00:53:20 - Rion Gull
Yeah, let's open the developer console and see what's happening. Let's see how many logs he's got going on.
00:53:32 - Anthony Campolo
400, 100, and then there's just this empty array. Not sure what that's doing.
00:53:38 - Rion Gull
Okay. I don't know. We could check because does it have source maps? Let's see.
00:53:46 - Anthony Campolo
It's an app.jsx.
00:53:48 - Anthony Campolo
So, it's gonna be right here.
00:53:50 - Anthony Campolo
We're console logging. Oh, a shitload of things. 525 console logs. I'm not sure exactly what— this is a very, very large app.jsx. I'm not sure I would even know what the hell to do with this, honestly. Okay.
00:54:07 - Rion Gull
Wait. Let's— How many lines is this?
00:54:11 - Anthony Campolo
15,000.
00:54:14 - Rion Gull
Is this just one big app, one big file, and that's where all the application code is?
00:54:19 - Anthony Campolo
Oh, I mean, there's all these components as well.
00:54:21 - Rion Gull
Okay. So, lots of components. This is a big app.
00:54:26 - Anthony Campolo
Yes.
00:54:27 - Rion Gull
App.js is 15,000 lines.
00:54:29 - Anthony Campolo
Wow. It's also a class component. Good for you, whoever built this.
00:54:39 - Rion Gull
I'm not a fan of myself. Let's go back to the logs and see what that was logging out.
00:54:52 - Anthony Campolo
I'm not really sure because when I Ctrl+F, compile has 525 things.
00:54:59 - Rion Gull
It doesn't show you the line. Is it showing you the line of the compiler?
00:55:04 - Anthony Campolo
Let's see. Oh yeah, sorry. 1011.
00:55:07 - Rion Gull
Yeah.
00:55:13 - Anthony Campolo
Great. So that's our keys. Okay.
00:55:16 - Rion Gull
That's what I thought it would— that's what I thought it would be because something like that, because we haven't actually— we haven't actually got our mnemonic yet. Let's have it create one for us.
00:55:30 - Anthony Campolo
Cool. There we go.
00:55:34 - Anthony Campolo
So, then we're gonna copy this.
00:55:38 - Anthony Campolo
And let me copy, save both of these.
00:55:49 - Anthony Campolo
So, then what do I do with— so, I guess I wanna log in then.
00:55:55 - Anthony Campolo
So—
00:55:59 - Anthony Campolo
This is cool. This is like a lot of what I probably was going to kind of end up building, so I'm glad I know this exists. Yep.
00:56:07 - Anthony Campolo
So now send funds.
00:56:10 - Rion Gull
Yeah, this is a good— this is a good reference application.
00:56:14 - Anthony Campolo
Um, no, this is— this is super solid.
00:56:17 - Rion Gull
I do want to get it— I do want to get to a point where we have a good tutorial like a good single-page tutorial that's basically very similar to the Dash.org docs. But, well, ultimately maybe we could make the Dash.org docs closer to your tutorial like we were saying earlier. Where it's split between files and whatnot a little bit better.
00:56:42 - Anthony Campolo
So this is how I've tried to use the Faucet is I put my address in, hit get coins, and then it just kind of hangs.
00:56:50 - Rion Gull
Yeah, there's a problem with the Faucet website. You got the coins, I'm pretty sure. Okay, check the Explorer. Yeah, um, the testnet Explorer.
00:57:07 - Anthony Campolo
So yeah, you're not gonna find it there yet. Um, so yeah, so how do I, uh, go, go to Insight? I know how to I have it written in my own— yeah, tutorial. I can never find it by Googling it for some reason.
00:57:24 - Rion Gull
Yeah, well, Google's not gonna pick up testnets for Dash especially.
00:57:29 - Anthony Campolo
That makes sense. So it's currently confirming the transaction.
00:57:33 - Rion Gull
Yeah. Okay, so you got the coins?
00:57:36 - Anthony Campolo
Yes, I did.
00:57:44 - Anthony Campolo
And then once—
00:57:46 - Anthony Campolo
let me close out some— I got too many tabs open. Let me close these out. I'm still confirming.
00:58:09 - Rion Gull
Oh, it doesn't need to confirm to move on. Let's, let's go on with the application.
00:58:14 - Anthony Campolo
And then what's the next thing we do then?
00:58:17 - Rion Gull
So yeah, and this, this, this stream isn't meant to be like a full exploration of—
00:58:25 - Anthony Campolo
here we go.
00:58:25 - Rion Gull
All right, sure.
00:58:26 - Anthony Campolo
Identity.
00:58:37 - Rion Gull
Interesting.
00:58:37 - Anthony Campolo
That's interesting.
00:58:38 - Rion Gull
A bunch of errors happening in the console there.
00:58:41 - Anthony Campolo
I wonder what that we did. Get it?
00:58:44 - Rion Gull
Yeah.
00:58:45 - Anthony Campolo
Okay. And now we're going to buy a name.
00:58:48 - Rion Gull
So the identity— so the takeaway with that last step was that the identity creation worked in his application. So whatever his application is doing, we need to do that same thing, right?
00:59:00 - Anthony Campolo
Yeah. Yeah. So, I'm assuming— actually, well, let me just—
00:59:09 - Rion Gull
so, we could look at his client options, for example.
00:59:14 - Anthony Campolo
Let me check this real quick.
00:59:17 - Anthony Campolo
Okay. So, here's the create identity.
00:59:19 - Anthony Campolo
Huh. Okay.
00:59:22 - Anthony Campolo
So, I'll just have to kind of break down this code and see what's— because this is already involves some Reactisms. It's like setting state and all that.
00:59:31 - Rion Gull
Well, yeah. We're not gonna actually break that down because, like, we don't— I don't— I'm not particularly interested in exploring exactly how, like, what his application code is doing. I want to know what his client options are, for example, that's getting his create identity to work over the network, but ours is not working. Like, all that stuff is just his business logic.
01:00:01 - Anthony Campolo
Yeah. Okay. I see what you mean. Yeah. So, we would have to figure out where that is in this application. Yep.
01:00:06 - Anthony Campolo
Okay. So, let's try this.
01:00:22 - Rion Gull
Maybe you could do a find for client opts. Or client options.
01:00:27 - Anthony Campolo
Yep. There you go. Well, it shows up a lot of times though.
01:00:31 - Anthony Campolo
So, check platform only login. So, okay.
01:00:38 - Anthony Campolo
I mean, it looks like it's just doing offline mode and it's setting the mnemonic.
01:00:46 - Anthony Campolo
Hmm.
01:00:47 - Anthony Campolo
But it also looks like there's 256 versions of this variable. So, we need to figure out what the base one is.
01:00:54 - Rion Gull
Wow. That's interesting. Can you scroll through them? Yeah, just like cycle through.
01:01:01 - Anthony Campolo
Yeah, it just shows up all over the place. So, it looks like he's creating a client object each time he's doing a function. And then all of those are starting— are taking the doc array.
01:01:15 - Rion Gull
So, maybe—
01:01:15 - Anthony Campolo
I mean, like, so, could we get the person who built this on stream? Like, that would actually help a lot.
01:01:22 - Rion Gull
That's the problem.
01:01:24 - Anthony Campolo
Do you know who built this?
01:01:25 - Rion Gull
I don't know him. He's an anon. He's an anonymous guy on the internet.
01:01:30 - Anthony Campolo
Great. Okay, well, can I at least like— Is this the same person who was on the DashMoney account?
01:01:36 - Rion Gull
Yeah, yeah. He's available over text.
01:01:39 - Anthony Campolo
Okay, well, I know how to message him at least. Okay. Well, I'm going to need to actually go through this code and try and make sense of it then before we start bugging him. But is there anything else you want to do like from here? Because it sounds like we've got a working application and we hit the point that we were hitting an error and we're kind of like where we want to be, it seems like.
01:01:58 - Rion Gull
Yeah, yeah. I wanted to see that running locally we could get his code to connect to the network and yeah, and I wouldn't worry about deploying this.
01:02:08 - Anthony Campolo
I don't think that's really going to change.
01:02:09 - Rion Gull
We don't need to, we don't need to deploy anything necessarily. I just wanted to see that, that it was working. And it's too bad that he's got— how many was that, like hundreds of client option instances?
01:02:24 - Anthony Campolo
Yeah, 256.
01:02:25 - Rion Gull
So that's something that is not gonna— I mean, we could, we could do— we could look at like click handlers on the actual application and see what lines of code he's calling on certain clicks, but It's really what needs to happen is this application needs to be broken down into hooks.
01:02:43 - Anthony Campolo
Like, that's the problem is that it's a giant-ass class component. That's just kind of a problem with old-school React.
01:02:50 - Rion Gull
Yeah, and I, I don't— I'm not gonna say it's good or bad, but what I want for our tutorials is the absolutely slimmed-down version of bare-bones Hello World that goes through each of them. So yeah, it might be useful to try to, you know, dig into things, but it might be just as, as, as good to, um, work from our tutorial forward and, and try to, try to handle, you know, debug that way. It's, you know, we can take it from both angles and, and try to—
01:03:24 - Anthony Campolo
right, yeah, try to get it.
01:03:25 - Rion Gull
But my, my point is not necessarily to, um, My point is to get Hello World applications first in Node and then vanilla JavaScript like we've done. Just basically get our tutorials working. And yeah, the Dash Money app can help us do that, great. But it looks like it might even be harder to follow that line, that code, than to just debug from our code. So right now I think that's probably— I mean, we've gone an hour or so. I think we learned some things, we showed some things, and we can probably continue off stream to do— or you can just continue off stream and then we can stream again once we have done some off stream debugging. If we get past some errors and maybe somebody can help us out like in—
01:04:23 - Anthony Campolo
Yeah, I mean, currently where I'm at, I just need to refactor some of my tutorial to get it to work with the current state of the docs with the right synchronization. Then we can move forward from there. It's like I know exactly where we can go from here.
01:04:37 - Rion Gull
Yeah, cool. So I think that's a good place to stop then. Um, unless, unless you have everything, anything else to say, I guess we'll—
01:04:43 - Anthony Campolo
yeah, I think that's good. This is, um, super fun. I learned a bunch.
01:04:47 - Anthony Campolo
Cool.
01:04:48 - Rion Gull
Yeah, me too. I mean, that's good. Yeah.
01:04:50 - Anthony Campolo
So all right. Are we— well, you want to do the same time next Tuesday?
01:04:56 - Rion Gull
We don't have to wait till Tuesday. We don't have to even schedule these things. So in terms of coding, you know, AJ—
01:05:03 - Anthony Campolo
maybe we should aim for like Friday then. I think that would be good for me.
01:05:08 - Rion Gull
Yeah, whenever you have time, we'll just— you can hop on. We'll get you set up so that you can hop on whenever.
01:05:14 - Anthony Campolo
I can.
01:05:15 - Anthony Campolo
I'm already set to.
01:05:16 - Rion Gull
You're already set to just go live whenever.
01:05:19 - Anthony Campolo
Cool.
01:05:20 - Anthony Campolo
So that's actually, that's a, yeah, that's a good idea. I think next time I go live, I don't need you here because I can start working through my tutorial and just kind of retrofit it with the stuff we know that works. And then we'll see how far I get and we'll go from there. I'll probably do that Thursday or Friday.
01:05:34 - Rion Gull
Yeah. And you can, you can decide for yourself how much you want to work offline versus on screen. I, I kind of prefer more on screen.
01:05:44 - Anthony Campolo
No, I agree. Yeah, I absolutely agree. I've actually, I was watching my old streams. Earlier to try and like remind myself what was going on. I was like, man, I'm so glad I streamed this because it was very, very useful to go back and watch.
01:05:56 - Rion Gull
So yeah, I think it helps other developers as well because what I, what I don't like is I don't like all of the knowledge about like, oh, this is, this is the trick that you have to do for this setting.
01:06:06 - Anthony Campolo
Yeah, and you should message just one person to figure it out. It is a bit of an issue.
01:06:10 - Rion Gull
Yeah, I want it all open, open source. Yeah, so cool.
01:06:14 - Anthony Campolo
Awesome, man. Well, let's, um, let's head off and, um, we'll catch you all next time.
01:06:20 - Rion Gull
Peace.