Абстрактные
Учитывая, что взрыв в altcoins, будет разумно предположить, что торговцы будут принимать ряд различных криптографических монет в качестве платежей. Мы видим, что Bitcoin, Litecoin и Dogecoin как передние бегунов.
Я предлагаю вместо предоставления пользователя различных адресов для каждой валюты, торговцы могли бы использовать Сопряжение функцию Кантора, чтобы обеспечить «смешанный» адрес. Это позволит торговцам производить один уникальный QR-код и адрес. Пользователь может затем добавить кантор в паре адрес их кошелек выбора.
Число обмены могут уменьшить количество депозитных адресов, показанных пользователю.
Вводя новый тип пантомимы, бумажник программного обеспечение может разлагаться парный адрес и абстрактный адрес, который имеет отношение.
Возьмите адрес, установленный BTC 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T, LTC LaxGrwMeokoMgv5zYpv5btT4yNUB9DaiqE
Преобразование base58 адреса в десятичную, а затем применяя функцию урожайности канторовым Pair 4816056888050750582224742844031604102132678664282188647256495058920612654357063 8391750708909119424733449538336733090951
В base58
Например, тип мим Кантор: // 4Qu9uDoad4ymwntxwBYHhMLmGvfhBivMSPKAz5tX4iyKQ8xzx21YJsJzyUWWHHAShiFg
На настольном компьютере, пара и обратный принимает 12ms
Мысли?
Код:
с использованием системы;
используя System.Collections.Generic;
используя System.Linq;
используя System.Text;
используя System.Threading.Tasks;
Пространство имен CantorPairing
{
classProgram
{
staticvoid Main (string [] арг)
{
//
Console.Write ("Начните с Bitcoin адреса в качестве десятичного 4824855521912883454204125328393785564172057950402473856794");
Console.WriteLine ("или 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T");
Console.Write ("Добавить адрес litecoin десятичного 305531613334489417964998059632233568427215324197451409291673");
Console.WriteLine ("или LaxGrwMeokoMgv5zYpv5btT4yNUB9DaiqE");
System.Diagnostics.Stopwatch SW = System.Diagnostics.Stopwatch.StartNew ();
Org.BouncyCastle.Math.BigInteger = новый BTC Org.BouncyCastle.Math.BigInteger ("4824855521912883454204125328393785564172057950402473856794");
Org.BouncyCastle.Math.BigInteger LTC = новый Org.BouncyCastle.Math.BigInteger ("305531613334489417964998059632233568427215324197451409291673");
Org.BouncyCastle.Math.BigInteger bigResult = CantorPair (BTC, LTC);
Console.WriteLine ("Функция кантора спаривания дает число ", BigResult);
Org.BouncyCastle.Math.BigInteger [] = пара обратного (bigResult);
sw.Stop ();
Console.WriteLine (bigResult +" в "+ Sw.ElapsedMilliseconds +"Миз");
Console.WriteLine ("Btc {0}", Пара [0]);
Console.WriteLine ("Ltc {0}", Пара [1]);
Console.ReadKey ();
}
staticint CantorPair (короткий х, короткие у)
{
Возвращение ((х + у) * (х + у + 1)) / 2 + у;
}
статическая Org.BouncyCastle.Math.BigInteger CantorPair (Org.BouncyCastle.Math.BigInteger х, Org.BouncyCastle.Math.BigInteger у)
{
Org.BouncyCastle.Math.BigInteger xplusy = x.Add (у);
Org.BouncyCastle.Math.BigInteger xplusyplus1 = xplusy.Add (Org.BouncyCastle.Math.BigInteger.One);
Org.BouncyCastle.Math.BigInteger внутри = xplusy.Multiply (xplusyplus1);
Org.BouncyCastle.Math.BigInteger twoplusy = Org.BouncyCastle.Math.BigInteger.Two.Add (у);
вернуть xplusy.Multiply (xplusyplus1) .Divide (Org.BouncyCastle.Math.BigInteger.Two) .Add (у);
}
staticshort [] Reverse (интермедиат г)
{
Короче [] = пара newshort [2];
INT т = (целое) Math.floor ((- 1D + Math.Sqrt (1D + 8 * г)) / 2D);
INT х = т * (т + 3) / 2 г;
INT у = г - т * (т + 1) / 2;
пара [0] = (короткий) х;
пара [1] = (короткий) у;
вернуть пару;
}
статическое Org.BouncyCastle.Math.BigInteger [] Reverse (Org.BouncyCastle.Math.BigInteger г)
{
//"константы"
Org.BouncyCastle.Math.BigInteger три = новый Org.BouncyCastle.Math.BigInteger ("3");
Org.BouncyCastle.Math.BigInteger восемь = новый Org.BouncyCastle.Math.BigInteger ("8");
Org.BouncyCastle.Math.BigInteger [] пара = новый Org.BouncyCastle.Math.BigInteger [2];
Org.BouncyCastle.Math.BigInteger т = eight.Multiply (г) .Add (Org.BouncyCastle.Math.BigInteger.One);
Байт [] tempBytes = t.ToByteArray ();
Array.Reverse (tempBytes);
System.Numerics.BigInteger темп = новые System.Numerics.BigInteger (tempBytes);
System.Numerics.BigInteger корень = SQRT (темп);
Строка root3 = root.ToString ();
Org.BouncyCastle.Math.BigInteger root2 = новый Org.BouncyCastle.Math.BigInteger (root3);
т = root2.Subtract (Org.BouncyCastle.Math.BigInteger.One);
т = t.Divide (Org.BouncyCastle.Math.BigInteger.Two);
Org.BouncyCastle.Math.BigInteger tplus3 = t.Add (три);
Org.BouncyCastle.Math.BigInteger tplus1 = t.Add (Org.BouncyCastle.Math.BigInteger.One);
Org.BouncyCastle.Math.BigInteger х = t.Multiply (tplus3) .Divide (Org.BouncyCastle.Math.BigInteger.Two) .Subtract (г); // * (т + 3) / 2 - г;
Org.BouncyCastle.Math.BigInteger у = t.Multiply (tplus1) .Divide (Org.BouncyCastle.Math.BigInteger.Two); // - * т (т + 1) / 2;
у = z.Subtract (у);
пара [0] = х;
пара [1] = у;
вернуть пару;
}
publicstatic System.Numerics.BigInteger SQRT (System.Numerics.BigInteger п)
{
если (п == 0) return0;
если (п >0)
{
INT bitLength = Convert.ToInt32 (Math.Ceiling (System.Numerics.BigInteger.Log (п, 2)));
System.Numerics.BigInteger корень = System.Numerics.BigInteger.One << (BitLength / 2);
в то время как (! isSqrt (п, корень))
{
корень + = п / корень;
корень / = 2;
}
вернуть корень;
}
thrownewArithmeticException ("NaN");
}
privatestaticBoolean isSqrt (System.Numerics.BigInteger п, System.Numerics.BigInteger корень)
{
System.Numerics.BigInteger LowerBound = корень * корень;
System.Numerics.BigInteger UpperBound = (корень + 1) * (корень + 1);
возврата (п >= LowerBound && N < верхняя граница);
}
}
}