Help us find a better way to shield ETH/ERC-20 assets

Wow, really great responses, thanks guys.

What do you think about removing the mechanism of rotating temporary wallets entirely from the shield/unshield process?

What if we supported the creation/import of an Ethereum wallet in each Incognito wallet – essentially, the Incognito app would support in setting up a function that will enable that ETH wallet to call the shield or unshield function to the Incognito smart contract.

By supporting ethereum libs to call incognito smart contract, the user will be able to deposit/withdraw with that ETH wallet, and also be able to change/import/create a new ETH wallet to call the incognito smart contract at any time for maximum privacy. This way, the user is able to control how watertight his or her privacy is.

4 Likes

Interesting idea…
This would be only for ERC-20 Tokens correct? (For other coins the rotating address would remain)
With a system like this I would be able to import one of my current Ethereum wallets? I haven’t been wanting to send my tokens to the Incognito Platform because of high transaction fees, so this would be kind of neat. But I would still eventually have to pay them.

If I’m going to be honest, I have really grown attached to the shielding process. I think if the plan is to integrate Ethereum address’s, the current method of temporary address shielding should also remain. I feel like consistency in the process between the different cryptos is important.

The problem we are trying to solve is making the user-experience better. Setting up different systems for different types of coins may not be the move. What we really need to do is make the process more secure and consistent. Make user error difficult, and have transactions be successful 100% of the time. We also have to make the process seem inviting.

I think the way to do this is to have the option to choose different types of temporary shielding options.

  • Time Extended temporary addresses (variable time 1-24 hours) [Costs extra PRV]
  • Multi Transaction addresses (variable transaction amount 1-4) [Costs extra PRV]
  • Auto Trade to PRV address (automatically sends coins into a PRV trade)
  • Expedited shielding speed (Puts you higher up in the que)[Costs extra, Variable Fee]

There could be many different options, and you could make them cross compatible. Basically just adding extra parameters when creating the shielding address. This would require the availability of way more address’s, but now your also earning extra fees making it worth it. The standard temporary address would still be free, but if you want more security in your experience, you can pay a little extra.

3 Likes

It is great to see so many ideas and responses.

My way of looking at things is highly related to what I experience on a daily basis at CS.

Creating a system that is usable for everyone after you educate them sounds good in theory, but is really a no go in practice. Trust me on this one.

The first question to answer is, who are we building this for? Who are we aiming for to use it? Creating a system that has a steep learning curve kind of contradicts with the existence of the pNode, a device developed to attract the people unfamiliar with crypto and blockchain.

If the current issue is, expired transactions, and double use of the one-time deposit addresses, then focus on making that fool proof.

That said, the idea to support creation/import of Ethereum accounts sounds promising.

4 Likes

Now, I admit this isn’t an option that is truly in the spirit of being fully private/decentralised, however it could make the process a lot simpler for people who struggle to get to grips with the current process, or for those who don’t use/need incognito for its ‘privacy’ aspect.

  • Allow users the ability to generate a ‘permanent’ fixed shield address, that has an indefinite lifespan.
  • Users would be made aware that in doing this, their privacy may be compromised and their transactions may be able to be tracked. However, for some users, the privacy aspect isn’t going to be high on their priorities, rather they may just care about having their crypto stored somewhere safe and making a steady return. Hence why it would be an option a user would have to select.
  • This ‘fixed’ shield address could be closed at any point, and another ‘fixed’ one generated if the user felt they wanted to refresh it. However to prevent loss of funds, it would only be possible to close the fixed shield address once all crypto had been transferred out of it, and a set period of time had passed (maybe 24h), to ensure all remaining transactions had passed.

temporary shielding address for (each) user vs for (each incognito payment) address are 2 totally different things. so I have one question for op: which one are we talking about? to see the difference, let say user A’s wallet has 2 incognito payment addrs; consider the 2 approaches:

  1. temp addr for each inc addr:
    inc addr #1 <== temp addr #1 <== eth addr
    inc addr #2 <== temp addr #2 <== eth addr

  2. temp addr for each user:
    inc addr #1 <== temp addr <== eth addr
    inc addr #2 <== temp addr <== eth addr

in the 2nd approach, the privacy is lost since now we know the 2 inc payment addrs belong to the same user (since they have the same temp addr)
in the 1st approach, the privacy is reserved

=> for “maximal privacy” that many yearn for in this thread, the 1st approach is totally valid

the only problem with it is an operational one: the core team will have to manage 10000s of temp addrs, each one with its own balance; dusting (small amount of eth in those addrs to pay for gas) will eventually become a problem

if we instead opt for the 2nd approach, this problem still exists (albeit to a lower extend since the number of users << number of addresses)

and imo, this is the sole reason that the current flow (rotating addrs) was implemented: to reduce the number of temp addrs that the core team need to manage, not to preserve privacy

=================================

ninja edit: actually, in for the 2nd approach, once one-time-address is implemented, privacy will be fully preserved!!!

1 Like

Now Jamie makes a very good point…

another way of putting it perhaps is “if ain’t broke then why fix it”…so Jamie might be right about the matter for now…look at his post…makes alot sense to me what he posted…thank you Jamie for your post…so many things on other burners needing tending that perhaps the issue can be put on one of the back burners as the saying goes for a lil while and then revisited once some of the other projects in development and testing are completed…those are my two cents…nuff said… :sunglasses:

minus the 3 temp addrs, basically you are saying we keep the current flow (rotating addrs) with an additional button to set expiration time. what do you think about just fixing the expiration time to a high value (e.g., 72 hours)? require setting an additional value is just more confusing I’m afraid.

sounds like a good idea. but this feature is separated and it can be implemented outside the scope of this discussion
and about the 3 addrs, in your scheme I think we only need 2: one rotating (otherwise there’d be too many temp addrs) and one fixed (for tipping)

can you elaborate why and when a temp address must be “reserved”? what if someone indefinitely reserving an address? the pool of temp addrs will run out pretty quick

i’m thinking about this one too. which currency should the core team charge the users?

  1. if it’s in eth, depositing erc20 will require an additional tx since you can’t just send both assets at the same time.
  2. if it’s denominated in the same depositing asset, what if it’s some weird illiquid erc20? cannot just sell them to get eth and pay for fee.
  3. if it’s in prv: also, 2 txs (one incognito tx to pay for fee, another one is to send token to temp addr); also, now users need to have prv to deposit eth/erc20, which is another barrier of entry

hey - that’d be per payment address. edited post slightly to clarify. of course, if multiple temp addresses are generated along with multiple payment addresses, you are correct in saying a not insignificant amount of dust will accumulate across tens of thousands of such addresses.

here are more issues with the suggestion i outlined – a throwaway address/keychain mentality could bring about other complications; we have learned from experience that handling multiple keychains has been very difficult for many users. while users could of course generate multiple payment addresses to get multiple temp addresses in order to protect their privacy, we worry that the solution outlined above is a case of something that might work in theory (or for a small proportion of users), but not very well in reality. cue the discussion to explore ideas that more broadly protect the novice user without assuming knowledge/willingness/attentiveness to jump through extra hoops.

1 Like

I couldn’t agree more with @Jamie please find a way to to add more token options to Provide.

2 Likes

minus the 3 temp addrs, basically you are saying we keep the current flow (rotating addrs) with an additional button to set expiration time. what do you think about just fixing the expiration time to a high value (e.g., 72 hours)? require setting an additional value is just more confusing I’m afraid.

Yes also a fixed longer expiration time it could work… I was thinking about these situations (for example):

  • I ask money to a friend and create a new shielding address. I don’t know when my friend will send the money, maybe today, maybe tomorrow, maybe in a couple of days. So I set a longer expiration time for that address (even paying a fee if necessary)
  • I have to send to my wallet a big amount of money and I want maximum privacy, I want to do it quickly so I use a shielding address with default expiration time

I think adding a setting is not confusing if you add it in the correct way. For example, with a wallet you don’t need to know about gas fee amount, usually the wallet use a normal fee amount (or you can choose between slow, normal fast…), but there is always a way to click “advanced” and set your own gas fee. This is just an example. The meaning is: keep it simple but give the possibility to more advanced users to select more advanced/interesting options. You can for example set expiration to low (2h), normal (12h), high (72h) and also add an advanced panel (metamask style…)
Personally I like the rotating address structure (with an addresses pool) because if the addresses are used by a big amount of different people, the system is acting like a mixer, and it’s more difficult to associate a “name” to a particular TX. Like I wrote before, even if you use one-time addresses, if you use the same source address you still can determine how much money is going into incognito system.

sounds like a good idea. but this feature is separated and it can be implemented outside the scope of this discussion
and about the 3 addrs, in your scheme I think we only need 2: one rotating (otherwise there’d be too many temp addrs) and one fixed (for tipping)

It’s not really separated. You will use the same system. Simply set “no expiration” for that address. The 3 addresses it’s only a number… You potentially can have more expiring addresses. I will try to explain… If I initiate a shield operation, a new temp address will be created, with default expiration time and one-time use (it expires when funds are received OR when exp time is reached). If you create N shielding requests, N shielding temp addresses will be generated. But if I change the expiration time or something (customization) I could generate N addresses with longer expiration time (or even infinite) or reserve the addresses: this will reduce the number of address available in the addresses pool and some users could generate infinite no-expire addresses just for fun… So you limit the seats when you use the customized addresses and the “3” I used in the example was the allowed number of personalized shielding addresses…
I used 3 because maybe I need more than 1 temp address with longer expiration (eg. 2 friends need to send me money, they have a week to do so, I give a different address to each…). it could be also 5 for example… In this way you could, in case, also pay for the seats… Do you want another custom-expiration address, or a reserved one? Pay for the seat to keep it in use.

can you elaborate why and when a temp address must be “reserved”? what if someone indefinitely reserving an address? the pool of temp addrs will run out pretty quick

I think “reservation” is redundant probably. You are right. I was talking about reservation because the flow 2 proposed in the first post was talking about “a fixed address with manual retry”. Let’s remove the feature.

So:

  • You can shield with default settings, like how you do currently
  • You can shield creating a custom-expiration address, but you have limited seats for these addresses (eg. 3, 5, N…), with the possibility to pay for the seat (and use time, in case).
  • The custom-expiration address can be set to “no-epire” (used eg. for tipping) and can be configured to expire automatically after the first TX or not (use for multiple incoming TX)
  • You can always expire the address manually

There can be also other options/variants, like those described in the @Revolve message. For example adding a “speed” option to the seat. And paying for the use (especially for long expiration times)

Reading @elvis.p message, also this is an interesting idea for advanced users. For example you can remove the “no-expiration” option of my proposal, but add the create/import/delete wallet option for this purpose. However, this should be available to every bridged blockchain… I think the rotating address with customized expiration time is still better.

I have also an idea for paying the fees. Maybe too complicated, I don’t know. Now I’m thinking aloud…

For paying the fees (interaction with incognito smart contract), for example, you could pay/lock an amount of PRV used to cover the TX costs. After the expiration, the unused amount will be returned to the user. For example:

  • Pay/Lock 5 PRV when creating the shielding address
  • If TX is received, PRV are converted (for example) to ETH and used to cover operational costs (gas). Let’say these costs are equivalent to 3PRV. Then 2 PRV will be sent back (minus incognito network internal fees)
  • If no TX is received and address expires, 5PRV will be sent back.

For multi TX addresses there could be problems because you don’t know how many TX you can receive. In this case I see 2 options:

  1. Using a personal fees pool associated to the user. You deposit PRV there to cover for operational costs when shielding. If you run out of money the shielding process will be paused (new incoming TXs put in queue but not processed) until you recharge your pool. Also expiration will be paused if there are pending operations. When you recharge, the paused address will be processed sending all the remaining TX (and grouping them). The fees pool could be used also for unshielding and other incognito features, for example.
  2. You send the coins to the incognito smart contract only every N hours (T.B.D) and ask the user to pay for at least expiration_time_hours/N TXs returning the unused amount

The amount to ask must be also associated to the selected “speed” for the TX…
I think the fees pool feature could be interesting, since if you are shielding/unshielding a lot, or maybe you are using pKyber/pUniswap a lot, you need only to keep topped up you fees pool.
The personal pool system could be like the Provide feature. You provide PRV for paying fees not associated to incognito network itself.
What do you think?

Maybe you can ask the user to send some ETH/BTC/Something supported with a “special shielding” operation used only to generate some PRV used for covering fees, when the PRV balance of the account is not sufficient to cover shielding/unshielding costs. So the user will send the minimum required amount that will be converted directly to PRV, enabling the user to do all the operations. If the balance is no sufficient you lock the shield/unshield buttons, enabling only this “special shielding” (e.g. “top-up fees pool with shielding”).
It could be a barrier, because you need to send some coins to generate PRV used for fees before starting to use the account. But the alternative is to introduce more advanced (less user friendly) options or to give some shielding operations for free (this is dangerous, you could create infinite accounts just to have free shielding).

End of my aloud thinking…

4 Likes

I like the idea.
However the best feature of Incognito is interoperability. Moving coins in and out will always be the most used feature. You can have many users transacting inside the incognito network, but to reach most of the available blockchain services you need to move coins in/out (DeFi, exchanges connected to FIAT, services accepting payments only with ETH/BTC/…). Maybe in some cases it seems you are still inside Incognito (like pKyber) but the reality is that you are doing operations like shielding/unshielding, so moving coins in/out.
The best thing would be to have everybody on incognito chain, and all the world knowing the importance of privacy, fast transactions, privacy DEXs and so on. The reality is that to interact with the real world you have to use incognito as a privacy gateway.

1 Like

A new version of USDC came out which allows gasless sends. Basically third partys can pay the fees for the USDC token transfers. This means that users aren’t necessarily required to need ETH in their wallet to send USDC.

I was wondering if it would be possible to do the same for Incognito’s smart contracts. The problem with uniswap, and transfering ERC-20 tokens out of the network, is all the smart contract fees. Right now Incognito is taking the hit for these fees and are supplementing the costs which doesn’t seem sustainable. In the case for uniswap, the fees are quite high and are sent down for the user to pay.

What if we created a new system to pay for these fees. For example users could buy an incognito pCoin for PRV. All the PRV capital raised would be staked, and the returns would pay for all future smart contract fees. We charge a variable fee in PRV to all smart contract transactions (maybe like 25-50 cents depending on the average cost of all ETH transaction fees). This fee then gets delivered evenly to all the holders of this pCoin.

3 Likes

Horus my friend that was alot thinking indeed…lol… :exploding_head:…and therefore alot of reading for the rest of us…but hey it was good that you posted so many thoughts and that can be said for all who have posted their ideas…thank you…my thoughts is I wanna go strangle ETH and it’s stranglehold it has on so much at the moment especially with gas prices…lol…entire crypto verse is getting raked over the coals at the gas prices being charged…ugghh

this is really tough to solve; the only (acceptable) way that i could think of is for the app to randomly pick an incognito address in the wallet as the destination of the deposit; but this might be too inconvenient for the users

actually, forget it; the most promising approach is one-time-address (cue privacy v2); with it, we don’t need to generate unique payment addresses for each deposit

This. Full stop.

My two cents, maybe someone already had this idea, but here ya go.

Crazy, off the head thought, that probably can never exist, buuuut

is it possible that when you give a client a private wallet address that changes that one or the other could happen:

  1. When a person does work and requires payment, they give this specific payment address, but if the payer does not pay the payee in 60 minutes, that the new address is locked with that specific payer for a period of time. So as the address changes it so too changes BUT only for that specific client. Since that client is “trusted” and until the payment is made the client “shifts” with the updated address as it goes but is unaware of the address until they go to make the payment at that time.
    Therefore, the initial contact says pay me at this address “abc”, the payer says you got it, I’ll get to it tomorrow morning. Well by that time that address expires for “abc”, but when the client goes to pay the address has been rotating for that time and for this 60 minute time frame the address is now “xyz”. The payer may never realize the change, no frustration and all payments flow properly AND both parties are more secure by a rotating address.

  2. The address simply transitions with client for a period of time such as a month or a quarter with a warning that says a new address needs to be developed please contact your payer?

Gonna post this on the site but interested on the thoughts on here since not everyone goes there.

A type of fixed deposit address in any case would allow me to send my XYO from my COIN app straight to incognito without going to KuCoin that just got hacked for 150 million bucks and is still down making repairs!
Please make this a reality, I only want to send, swap and send out on incognito!!

I put this on another topic, if it’s been bought up then just ignore it, but here are my thoughts about customizing the shielding timeframe:

The shielding time frame has been increased to two hours. With the congestion of the network, and usability for deposits that will undoubtedly take 1 or more business days to complete, I think that my idea is a reasonable change, just slightly in the shielding process.

On the shielding page, the user selects-create new shielding address. At that time it auto pops up with 2 hours, then the user has the choice to select 1,2,3,4,5,6,7 days for this address to be usable.
The user clicks on a popup that warns about privacy stuff and to accept responsibility.
I like 7 days cause that covers a lot of bases without being ridiculous, but it also allows the user to assume responsibility but get better usability out of it.

One step further would be to auto update certain contacts with the newer address as well.
So you could have someone who pays you regularly to be set in stone that you trust, that you can revoke at any time, with your auto resetting wallet address.

2 Likes

I had an entire post with specific ideas but I clearly am not technically qualified enough to comment as some things in this thread don’t make sense to me and appear contradictory.

Do not do anything to increase gas fees or transaction complexity. Instead do things to simplify and cheapen the process of shielding and unshielding.

1 Like

I’ve thought about this some more and also had some issues where I needed to dig in on-chain.

I think all shielding should be to a brand new, never used wallet address. Once a token is received that wallet should be funded with ETH (either immediately, every X days, or X value accumulated. It doesn’t have to be immediately to save on gas fees. I’ve noticed exchanges and other apps will periodically sweep small amounts of funds but they don’t bother to spend the gas until a certain threshold is met. Further privacy enhancing techniques like only sweeping in blocks certain size lots–say 0.1, 0.5, 1, 5 btc—or lots of $1000 in stablecoins could aim to make all transactions into the smart contract address look similar).

It prevents address reuse (increased privacy). It will prevent a user from running into a previously tainted address associated with another user by an exchange or otherwise (kyc/reporting requirements and all). It also solves the problem of needing to pre-fund addresses with ETH that may never be used.

It could also let a user permanently keep that wallet address but if that is considered there should be a button to click to request a new wallet address. Sometimes an address can be tainted/used without actually sending coins to it.

2 Likes