Skip to content

Instantly share code, notes, and snippets.

@DavidVorick
Last active January 24, 2018 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DavidVorick/d3632b393c04cb05c5b688f8083e95f6 to your computer and use it in GitHub Desktop.
Save DavidVorick/d3632b393c04cb05c5b688f8083e95f6 to your computer and use it in GitHub Desktop.
An Argument against PoW Mining Patents

I wanted to highlight that patents in the PoW world are very bad for the health of a cryptocurrency. The problem is that if one party or group has exclusive access to an advantage, they will over time be able to put every one else out of business, even if that advantage is small. For this reason, cryptocurrencies should be very proactive about shutting down patents that are owned by mining companies or groups, lest they fall into complete centralization.

Let's assume that we have 2 parties mining. One party (party A) has a patented 30% efficiency advantage over the other party. These parties each start with 40 TH/s, and buying more hashrate costs $10 per TH/s. The party without the patent (Party B) needs to spend $1 per month on electricity per TH/s, while Party A only needs to spend $0.70 per month on electricity. The total block reward is $100 per month. Let's find out what happens each month as the two parties continue to reinvest their profits into buying more hashrate:

Month 1
	Total Hashrate: 80.0 TH/s - split is 50.0/50.0

	A has 40.0 TH/s
	A spends $40.0 on electricity
	A earns $50.0 total for having 50.0% of the hashrate
	A buys 1.0 TH/s with the 10.0 in profits

	B has 40.0 TH/s
	B spends $28.0 on electricity
	B earns $50.0 total for having 50.0% of the hashrate
	B buys 2.2 TH/s with the 10.0 in profits

Month 2
	Total Hashrate: 83.2 TH/s - split is 49.3/50.7

	A has 41.0 TH/s
	A spends $41.0 on electricity
	A earns $49.3 total for having 49.3% of the hashrate
	A buys 0.8 TH/s with the 8.3 in profits

	B has 42.2 TH/s
	B spends $29.5 on electricity
	B earns $50.7 total for having 50.7% of the hashrate
	B buys 2.1 TH/s with the 8.3 in profits

Already you can see something concerning for Party A. A's monthly earnings are decreasing, while B's monthly earnings are increasing. If this continues, Party A will be pushed out of business entirely. And, using this code simulation, you can see that it only takes about 9 months total: https://play.golang.org/p/2Q7pltxZGVa

Even if you give 'B' only a slight advantage in the simulator, for example 'A' pays $1 for electricty, and B pays $0.98 for electricity, you can see that 'A' still goes out of business after only 29 months. In mining, any slight advantage owned by one party eventually turns into a complete monopoly so long as that party continues to reinvest their profits into more hashrate. As cryptocurrency designers, we need to take action if one party is able to obtain a long term advantage over another party.

Appendix A:
code snippet from the play.golang.org link:

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Mining Unfairness Lifetime Calculator")

	partyAHashrate := 40.0
	partyBHashrate := 40.0
	partyACost := 1.0
	partyBCost := 0.7
	hashrateCost := 10.0
	totalReward := 100.0

	display := true // set to false to disable the month-by-month status printouts.

	profitableA := func() bool {
		totalHashrate := partyAHashrate + partyBHashrate
		partyAReward := partyAHashrate / totalHashrate * totalReward
		partyACost := partyAHashrate * partyACost
		return partyAReward > partyACost
	}
	profitableB := func() bool {
		totalHashrate := partyAHashrate + partyBHashrate
		partyBReward := partyBHashrate / totalHashrate * totalReward
		partyBCost := partyBHashrate * partyBCost
		return partyBReward > partyBCost
	}

	var months int
	for profitableA() && profitableB() {
		months++

		totalHashrate := partyAHashrate + partyBHashrate
		aFraction := partyAHashrate / totalHashrate * 100
		bFraction := partyBHashrate / totalHashrate * 100
		if display {
			fmt.Printf("\nMonth %v\n\tTotal Hashrate: %.1f TH/s - split is %.1f/%.1f\n", months, totalHashrate, aFraction, bFraction)
		}
		partyAReward := partyAHashrate / totalHashrate * totalReward
		partyACost := partyAHashrate * partyACost
		partyBReward := partyBHashrate / totalHashrate * totalReward
		partyBCost := partyBHashrate * partyBCost
		partyAPurchase := (partyAReward - partyACost) / hashrateCost
		partyBPurchase := (partyBReward - partyBCost) / hashrateCost

		if display {
			fmt.Printf("\n\tA has %.1f TH/s\n\tA spends $%.1f on electricity\n\tA earns $%.1f total for having %.1f%% of the hashrate\n\tA buys %.1f TH/s with the %.1f in profits\n", partyAHashrate, partyACost, partyAReward, aFraction, partyAPurchase, partyAReward-partyACost)
			fmt.Printf("\n\tB has %.1f TH/s\n\tB spends $%.1f on electricity\n\tB earns $%.1f total for having %.1f%% of the hashrate\n\tB buys %.1f TH/s with the %.1f in profits\n", partyBHashrate, partyBCost, partyBReward, bFraction, partyBPurchase, partyAReward-partyACost)
		}

		partyAHashrate += partyAPurchase
		partyBHashrate += partyBPurchase
	}

	if !profitableA() {
		fmt.Println("\nParty A became unprofitable after", months, "months and went out of business.")
	} else if !profitableB() {
		fmt.Println("\nParty B became unprofitable after", months, "months and wend out of business.")
	}
	
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment