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.")
}
}