Skip to content

Instantly share code, notes, and snippets.

@dooglus
dooglus / coinswap-design.md
Last active Feb 27, 2021 — forked from chris-belcher/coinswap-design.md
Design for a CoinSwap Implementation for Massively Improving Bitcoin Privacy and Fungibility
View coinswap-design.md

Design for a CoinSwap Implementation for Massively Improving Bitcoin Privacy and Fungibility

25/5/2020

Abstract

Imagine a future where a user Alice has bitcoins and wants to send them with maximal privacy, so she creates a special kind of transaction. For anyone looking at the blockchain her transaction appears completely normal with her coins seemingly going from address A to address B. But in reality her coins end up in address Z which is entirely unconnected to either A or B.

Now imagine another user, Carol, who isn't too bothered by privacy and sends her bitcoin using a regular wallet which exists today. But because Carol's transaction looks exactly the same as Alice's, anybody analyzing the blockchain must now deal with the possibility that Carol's transaction actually sent her coins to a totally unconnected address. So Carol's privacy is improved even though she didn't change her behaviour, and perhaps had never even heard of this software.

View gist:0fa81be1f9b087142ef987a06d6824d3
#!/usr/bin/env python
import random, string, time
def rand():
return start_date + random.random() * (end_date - start_date)
def fmt(seconds):
return '[%s]' % time.ctime(seconds)
View gist:351c25605a60a0c9b3af41d14004e4ff
def evaluate(hand):
ranks = '23456789TJQKA'
if len(hand) > 5: return max([evaluate(hand[:i] + hand[i+1:]) for i in range(len(hand))])
score, ranks = zip(*sorted((cnt, rank) for rank, cnt in {ranks.find(r): ''.join(hand).count(r) for r, _ in hand}.items())[::-1])
if len(score) == 5: # if there are 5 different ranks it could be a straight or a flush (or both)
if ranks[0:2] == (12, 3): ranks = (3, 2, 1, 0, -1) # adjust if 5 high straight
score = ([1,(3,1,2)],[(3,1,3),(5,)])[len({suit for _, suit in hand}) == 1][ranks[0] - ranks[4] == 4] # high card, straight, flush, straight flush
return score, ranks
@dooglus
dooglus / public.py
Created Aug 13, 2016
create Bitcoin public key from private key
View public.py
#! /usr/bin/env python
class Point(object):
def __init__(self, _x, _y, _order = None): self.x, self.y, self.order = _x, _y, _order
def calc(self, top, bottom, other_x):
l = (top * inverse_mod(bottom)) % p
x3 = (l * l - self.x - other_x) % p
return Point(x3, (l * (self.x - x3) - self.y) % p)
View gist:40b56a1dfc3eb14f67e84c5489182db9
Verifying that +dooglus2 is my blockchain ID. https://onename.com/dooglus2
View gist:1426a596d59b722d3312
import random, math
num_sims = 1000
num_rolls = 1000
chance = 5/100.0
edge = 1 - 2*chance
start_bank = 1000
risk = 0
while risk < 1:
@dooglus
dooglus / clams.py
Last active Jan 2, 2016
clamd in Python, accepting long commands on standard input
View clams.py
#!/usr/bin/python
from __future__ import print_function
import base64, httplib, json, string, sys, re
USER = 'user'; PASS = 'pass'; HOST = '127.0.0.1'; PORT = 30174
class RPC:
def __init__(self, host, port, username, password):
self.authhdr = "Basic %s" % (base64.b64encode("%s:%s" % (username, password)))
self.conn = httplib.HTTPConnection(host, port, False, 30)
View development_genesis.json
{
"nonce": "0x0000000000000042",
"difficulty": "0x40000",
"alloc": {
"bbbbbaaaaa82db86a35502193b4c6ee9a76ebe8f": {
"balance": "10015200000000000000000"
},
},
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
View gist:863daab1a8c6431b6338
#include <boost/spirit/include/classic_core.hpp>
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdint.h>
using namespace std;
using namespace boost::spirit::classic;
struct count_satoshis