为什么比特币交易系统使用输入/输出系统

为什么比特币使用输入/输出系统?
来自手机版
我们为什么不直接使用余额?交易确认之前节点将验证余额大于0。
楼主看看100行代码发动的修改交易ID的可锻性攻击。假设是采用余额记录而非输入输出,那么就可能两交易都写入区块了。从而系统混乱无人再敢发币。而现在这种输入输出则完全不怕。第二个修改ID后的交易,使用的是相同的输入,而此输入已经币已经支出了,从而是安全的。不必担心真发两次。
E网情深比特币
这个应该和双花有关系吧
出来给大家说一下爽花
我只是一个看客
为了安全吧
看不懂啊!一知半解中
其实我们现在也是类似于直接使用余额的。为什么不直接使用账号和余额对?
因为那种记录方式,很容易被黑客篡改,轻松突破2100万。
而这种输入等于输出,会每个币都能向上溯源,从而实现币量上限2100万的可靠。
【域名】【导航】
这个应该和双花有关系吧
楼主看看100行代码发动的修改交易ID的可锻性攻击。假设是采用余额记录而非输入输出,那么就可能两交易都写入区块了。从而系统混乱无人再敢发币。而现在这种输入输出则完全不怕。第二个修改ID后的交易,使用的是相同的输入,而此输入已经币已经支出了,从而是安全的。不必担心真发两次。
您需要登录后才可以发帖
作者的其他主题比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言) | 巴比特
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)
(原理部分请参考:《)
依赖库:openssl-1.01h ,参考文档:
为降低代码复杂度,本文借助了openssl库来实现大整数(BIGNUM)的运算、伪随机数的生成、HASH算法、密钥生成以及数字签名。
比特币系统中的整数字节顺序:(首先要搞清楚字节次序,看bitcoin-qt源码时会有一定帮助)
大整数(超过64位的)使用big endian编码,如HASH值。
64位及以下的变长整数使用little endian编码,如Varint, Compact Integer等。
64位及以下的常规整数使用系统内定的编码。如int64_t, itn32_t等。
一、 哈希函数:
目前bitcoin-qt中的使用的HASH函数主要是Hash256和Hash160。(代码中预留了Hash512,但未使用)
Hash256是对原始数据进行两次SHA256操作,生成一个256位(bit)的HASH结果。应用场合:block_header, 交易(Transactions),base58check校验等。
Hash160是对原始数据先进性一次SHA256操作,再对生成的hash值进行RIPEMD160操作,生成一个160位(bit)的HASH结果。应用场合:bitcoin地址。
示例代码:
#define HASH256_SIZE (32)
#define HASH160_SIZE (20)
size_t Hash256(const unsigned char * begin, size_t size, unsigned char to[])
unsigned char hash[HASH256_SIZE];
if(NULL == begin || size == 0) return 0;
SHA256(begin, size, (unsigned char *)&hash[0]);
SHA256(&hash[0], sizeof hash, (unsigned char *)&to[0]);
return HASH256_SIZE;
size_t Hash160(const unsigned char * begin, size_t size, unsigned char to[])
unsigned char hash[HASH256_SIZE];
if(NULL == begin || size == 0) return 0;
SHA256(begin, size, (unsigned char *)&hash[0]);
RIPEMD160(&hash[0], sizeof hash, &to[0]);
return HASH160_SIZE;
二、 Base58编码
编码特点:输出结果为不容易混淆的字母和数字,便于鼠标操作(用鼠标双击即可选取完整的文本)。
应用场合:Bitcoin的地址、私钥导出。
编码步骤:
将原始数据看作一个大整数 E
(1) r = E mod 58
(2) 将r附加到输出缓冲区,
(3) E = E / 58, 若E ≠ 0,则返回(1)
(4) 检查原始数据是否有前导的’0’,如有,则将base58编码的0添加到输出缓冲区中
(5) 字符串反转(转换成big endian的格式)
示例代码:
static const char* pszBase58 = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
size_t Base58Encode(const unsigned char *begin, size_t size, char *to)
size_t cb = 0;
BN_CTX * ctx = NULL;
unsigned char *pzero = (unsigned char *)
unsigned char *pend = (unsigned char *)(begin + size);
// bool fSign = 0;
BIGNUM bn, dv, rem, bn58, bn0;
if((NULL == begin) || (size == 0)) return 0; // invalid parameter
cb = size * 138 /100+1; // the size of output will less than (138/100 * sizeof(src))
//** output buffer should be allocated enough memory
if(NULL == to)
BN_init(&bn58); BN_init(&bn0);
BN_set_word(&bn58, 58);
BN_zero(&bn0);
BN_init(&bn); BN_init(&dv); BN_init(&rem);
BN_bin2bn(begin, size, &bn);
ctx = BN_CTX_new();
if(NULL==ctx) return 0;
// 前面的都是初始化工作,下面是正式的算法
while(BN_cmp(&bn, &bn0) & 0)
if(!BN_div(&dv, &rem, &bn, &bn58, ctx))
c = BN_get_word(&rem);
*(p++) = pszBase58[c];
// 添加前导的0
while(*(pzero++)==0)
*(p++) = pszBase58[0];
if(pzero & pend)
ReverseBytes((unsigned char *)to, cb); // output as a big endian integer
BN_CTX_free(ctx);
解码步骤:
static const int8_t b58digits[] = {
-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-1,-1,-1,-1,-1,-1,
-1, 9,10,11,12,13,14,15, 16,-1,17,18,19,20,21,-1,
22,23,24,25,26,27,28,29, 30,31,32,-1,-1,-1,-1,-1,
-1,33,34,35,36,37,38,39, 40,41,42,43,-1,44,45,46,
47,48,49,50,51,52,53,54, 55,56,57,-1,-1,-1,-1,-1,
size_t Base58Decode(const char *begin, size_t size, unsigned char *to)
unsigned char *p = (unsigned char *)
unsigned char *pend = p +
BIGNUM bn,
BIGNUM bn58, bn0;
BN_CTX *ctx = BN_CTX_new();
if(NULL == ctx) return 0;
BN_init(&bn58);
BN_init(&bn0);
BN_init(&bn); BN_init(&bnchar);
BN_set_word(&bn58, 58);
BN_zero(&bn0);
while(p & pend)
if(c & 0x80) goto label_
if(-1 == b58digits[c]) goto label_
BN_set_word(&bnchar, b58digits[c]);
if(!BN_mul(&bn, &bn, &bn58, ctx)) goto label_
BN_add(&bn, &bn, &bnchar);
cb = BN_num_bytes(&bn);
if(NULL == to)
BN_bn2bin(&bn, to);
BN_CTX_free(ctx);
label_errexit:
if(NULL != ctx) BN_CTX_free(ctx);
三、 私钥生成
比特币系统中的私钥是一个256位(bits)的随机整数。
取值范围在[1,n-1]之间,其中,
n (order) = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
生成步骤:
1、初始化伪随机数种子
2、生成一个256位的随机数
3、验证随机数范围是否在[1,n-1],如超出范围,则返回2
示例代码:
BOOL ECKey_Check(const unsigned char vch[32]);
uint32_t ECKey_GeneratePrivKey(EC_KEY * pkey, unsigned char vch[32])
RandAndSeed(); // 初始化随机数种子,具体实现请参考附件中的源文件,或bitcoin-qt的源码
RAND_bytes(vch, 32); // 利用openssl库生成一个256位的随机数
}while(!ECKey_Check(vch)); // 检查取值范围是否合法
if(pkey != NULL) return ECKey_GenKeypair(pkey, vch); // 生成密钥对
return 32; // 私钥的字节数
BOOL ECKey_Check(const unsigned char vch[32])
static const unsigned char order[32] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,
0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40
BIGNUM // 私钥
BIGNUM bnO // G在Fp下的序号order
BIGNUM bn0; // 0
BN_init(&bn);
BN_init(&bnOrder);
BN_init(&bn0);
BN_zero(&bn0);
BN_bin2bn(vch, 32, &bn); //将二进制序列转化为一个大整数
BN_bin2bn(order, 32, &bnOrder);
//** 0 & [私钥] & order
if(BN_is_zero(&bn)) return 0; // 私钥不能为0
if(BN_cmp(&bn, &bnOrder) & 0) return 0; //私钥必须小于order
四、公钥的生成
公钥的计算公式:Q = dG
G: 椭圆曲线基点
//** 初始化EC_KEY,告知openssl库将使用secp256k1椭圆曲线。
EC_KEY * ECKey_new()
return EC_KEY_new_by_curve_name(NID_secp256k1);
uint32_t ECKey_GenKeypair(EC_KEY * pkey, unsigned char vch[HASH256_SIZE])
//** pkey = ECKey_new();
const uint32_t key_size = HASH256_SIZE;
const EC_GROUP *
BIGNUM * privkey = &
BN_CTX * ctx = NULL;
EC_POINT * pubkey = NULL;
if(NULL == pkey) return 0;
BN_init(&bn); // BIGNUM使用前最好先初始化,否则windows + mingw环境下有时会出错
group = EC_KEY_get0_group(pkey); // group结构体中存储了G值和运算规则
pubkey = EC_POINT_new(group); // 给pubkey分配内存,pubkey为曲线上的一个点
ctx = BN_CTX_new();
if(NULL == pubkey || NULL == ctx) goto label_
if(BN_bin2bn(vch, key_size, &bn)) // 将私钥(二进制形式)转化为一个大整数
if(EC_POINT_mul(group, pubkey, privkey, NULL, NULL, ctx)) // pubkey =privkey*G
// 将密钥存储于EC_KEY结构体中,便于导出为所需的格式
EC_KEY_set_private_key(pkey, privkey);
EC_KEY_set_public_key(pkey, pubkey);
BN_clear_free(&bn);
EC_POINT_free(pubkey);
BN_CTX_free(ctx);
return key_
label_errexit:
if(NULL!=pubkey) EC_POINT_free(pubkey);
if(NULL != ctx) BN_CTX_free(ctx);
公钥提取:
uint32_t ECKey_GetPubkey(EC_KEY * pkey, unsigned char * pubkey, BOOL fCompressed)
unsigned char * p_pubkey =
EC_KEY_set_conv_form(pkey, fCompressed?POINT_CONVERSION_COMPRESSED:POINT_CONVERSION_UNCOMPRESSED); // 公钥采用压缩还是非压缩格式输出
cb = i2o_ECPublicKey(pkey, NULL);
if(0==cb || cb&65) return 0;
if(NULL == pubkey)
// 此处不要直接用pubkey,openssl库会自动修改传递进去的指针
cb = i2o_ECPublicKey(pkey, &p_pubkey);
五、 比特币地址的生成和私钥的导出
比特币地址的生成:
1、H0 = Hash160(公钥)
2、在H0前添加版本号: 0×00,
–& extH0
3、生成校验值H1 = Hash256(extH0)
4、将H1的前四个字节 复制到extH0之后, ext_pubkey ={0×0, H0, &first 4 bytes of H1&};
5、对ext_pubkey进行base58编码,输出的结果即为比特币地址
//**************************************************
//** Base58check编码生成比特币地址
uint32_t PubkeyToAddr(const unsigned char * pubkey, size_t size, char *to)
unsigned char vch[20];
unsigned char checksum[4];
unsigned char hash[32]={0};
printf("ext_pubkey size: %d\n", sizeof(ext_pubkey));
ext_pubkey.version = 0x00;
Hash160(pubkey, size, &ext_pubkey.vch[0]);
Hash256(&ext_pubkey.version, 1+20, hash);
memcpy(ext_pubkey.checksum, hash, 4);
return Base58Encode((unsigned char *)&ext_pubkey.version, sizeof(ext_pubkey), to);
私钥导出格式:
1、将私钥转化为256位的二进制格式V
2、在V前添加版本号: 0×80, (如果使用压缩标志,则在V后再添加一个0×01),–&extV
3、生成校验值H1 = Hash256(extV)
4、将H1的前四个字节 复制到extV之后, ext_privkey ={0×80, V, (0×01), &first 4 bytes of H1&};
5、对ext_privkey进行base58编码,输出的结果即为比特币地址
uint32_t PrivkeyToWIF(const unsigned char vch[HASH256_SIZE], char *to, BOOL fCompressed)
unsigned char vch[HASH256_SIZE];
unsigned char checksum[5];
unsigned char hash[HASH256_SIZE];
uint32_t offset = fCompressed?1:0;
ext_privkey.version = 0x80;
memcpy(ext_privkey.vch, vch, 32);
if(offset) ext_privkey.checksum[0] = 0x01;
Hash256(&ext_privkey.version, 1 + HASH256_SIZE +offset, hash);
memcpy(&ext_privkey.checksum[offset], hash, 4 );
return Base58Encode(&ext_privkey.version, 1 + HASH256_SIZE + offset + 4, to);
六、签名和验证
签名步骤:
1、H = Hash256(M)
2、调用openssl的ECDSA_do_sign函数,生成签名sig = (r,s)。
3、检查s值是否大于order/2,如果大于,则利用 s + (-s) = order, -s = order –s, 这一性质将签名改写为(r, -s)的形式。这两种形式的签名是等效的,但如果s & order/2,由于验证方的实现方式不可预知,验证方有可能将其视为一个更大的正整数而不是-s,这会导致签名验证失败。
size_t ECKey_Sign(EC_KEY *pkey, const unsigned char hash[HASH256_SIZE], unsigned char **to)
//** if (*to) == NULL, the caller should use OPENSSL_free(*to) to free the memory
size_t cb = 0;
ECDSA_SIG *sig = NULL;
BN_CTX * ctx = NULL;
BIGNUM // The order of G
BIGNUM // get sign/unsign mark
unsigned char *output = NULL;
const EC_GROUP * group = EC_KEY_get0_group(pkey); // secp256k1: G
if(NULL == group) return 0;
sig = ECDSA_do_sign((unsigned char *)&hash[0], HASH256_SIZE, pkey);
if(NULL == sig) return 0;
//** sig = (r,s) = (r,-s)
//** s must less than order/2, otherwise, some app may parse '-s' as a large unsigned positive integer
ctx = BN_CTX_new();
if(NULL == ctx) goto label_
//** allocate memory for bignum
BN_init(&order);
BN_init(&halforder);
// get the order of G
EC_GROUP_get_order(group, &order, ctx); // secp256k1: n
BN_rshift1(&halforder, &order);
if(BN_cmp(sig-&s, &halforder)&0)
// if s & order/2, then output -s. (-s = (order - s))
BN_sub(sig-&s, &order, sig-&s);
BN_CTX_free(ctx);
output = *
cb = ECDSA_size(pkey);
if(NULL == output)
output = (unsigned char *)OPENSSL_malloc(cb);
if(NULL == output) goto label_
if(NULL == *to) *to =
//** i2d_ECDSA_SIG DER encode content of ECDSA_SIG object
//** (note: this function modifies *pp (*pp += length of the DER encoded signature)).
//** do not pass the address of 'to' directly
cb = i2d_ECDSA_SIG(sig, &output);
label_exit:
ECDSA_SIG_free(sig);
验证签名:
BOOL ECKey_Verify(EC_KEY *pkey, const unsigned char hash[HASH256_SIZE], const unsigned char *sig, size_t size)
if(ECDSA_verify(0, (unsigned char *)&hash[0], HASH256_SIZE, sig, size, pkey) != 1) // -1 = error, 0 = bad sig, 1 = good
return FALSE;
return TRUE;
3. VS6下需要下载gnu兼容的
BTC addr:1ChEiWRkJJMBZVQojqjvW5fTB7hhUng129
版权声明:
作者保留权利。文章为作者独立观点,不代表巴比特立场。
您需要登录后才可以回复
c332ed8acf910cf6230fe1
回复@羽毛币李志:[呵呵]
回复@羽毛币李志:
@吾谓话剧社 您好!来自【微问】的网友向您请教院校信息方面的问题:“南京财经大学2014年在新疆这里招生吗”『分享知识和经验来帮助TA,请点击
』回答还能攒积分换礼品,iPad在向你招手!不愿收到求助信息请点击http://t.cn/8F4Kgad
很好的代码剖析
书读百遍,其义自见。。。虽然基础不好,但多花点时间,闲下来多看看,总是有收货的。互联网的分享精神真棒!哈哈。。。没准哪天我也是码农了呢?
[花心]//@bitPaul: [好喜欢]好东西。
//@bitPaul: [好喜欢]好东西。
牛//@bitPaul:[好喜欢]好东西。
[好喜欢]好东西。
[c得瑟]韩版[ali扑]格子欧根纱中长半身裙a字高腰裙季式长裙http://t.cn/RvXylYW
又不是你学校….
《比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)》http://t.cn/RvaWcyL 为降低代码复杂度,本文借助了openssl库来实现。一、 哈希函数;二、 Base58编码;三、 私钥生成;四、公钥的生成;五、 地址的生成和私钥的导出;六、签名和验证 @chehw_1 [汗]大神!!
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言):
(《第三部分:交易细节》稍后再发,正在测试代码ing……) 上传我的文档
 下载
 收藏
文档分享。
 下载此文档
正在努力加载中...
基于IC卡的比特币支付系统的研究与设计
下载积分:2000
内容提示:基于IC卡的比特币支付系统的研究与设计
文档格式:PDF|
浏览次数:0|
上传日期: 09:37:45|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
基于IC卡的比特币支付系统的研究与设计
关注微信公众号比特币原理
应网友要求,现在简单介绍一下比特币原理
在介绍比特币原理之前,首先介绍几个重要的概
念,不明白这些计算机概念,就很难理解比特币
到底是什么。
壹--基本概念
一.非对称加密
我们知道,在通讯过程中,我们常常需要既能传
递信息,又不希望除了我们希望传达的目标之外
第三方获得通讯内容。那么,对内容加密就成了
我们的选择。
传统的加密方式是信息发送方和信息接收方根据
事先约定的规则对信息进行加密和解密。比如约
定一个密码字典,通讯内容是字典第几页第几个
字,那么,在不知道密码字典的情况下,你很难
知晓通讯实际内容。这种加密方式,称为对称加
密,即加密和解密方式对称,通过同一本密码
对称加密的好处很多,比如加密和解密速度快,
无规律,等等。但是,对称加密有个致命弱
点,就是密码字典的传送的安全问题,密码字典
一但被劫获,整个信息的安全就土崩瓦解,包括
曾经发送的历史信息都不存在安全性可言。
未完待续....
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
楼主邀你扫码
参与上面帖子讨论
发表于:13-12-04 21:47
发表于:13-12-04 22:04
在喝酒,到家如果没喝多继续,否则明天
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-04 22:20
能不能不要讲这些深层的加密算法,对普通人来说,他们并不关心,而且关心不了。
对专业人士来说,非对称算法如果作为一个电子货币的基础算法的话,并不保险,768位的RSA被破解是即将到来的事,也许1024位的RSA说不定早就被CIA破解了。
希望讲讲比特币发放量谁来确定的?由无商业机构掌控?
另外,如果作为货币的属性,一个是稀缺性,一个是有实际使用价值,比特币并不具备这两个基本属性。
稀缺性是人为操控的,而且比特币并不具备实际使用价值。
纸币虽不具备上述两个属性,但是以各国央行的黄金为勾连的。但比特币跟谁关联了?感觉纯属金融传销骗局。
发表于:13-12-04 22:31
喝酒间隙讲一些我对比特币的看法,这也是我为什么愿意花费时间跟大家解释比特币原理的原因,大众对比特币的看法,很多时候是源于对新生事物的无知,我想做到的是让大家对比特币清楚的认识之后再做评判。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-04 22:33
以下是引用 第5楼 @sinner5 的话:
喝酒间隙讲一些我对比特币的看法,这也是我为什么愿意花费时间跟大家解释比特币原理的原因,大众对比特币的看法,很多时候是源于对新生事物的无知,我想做到的是让大家对比特币清楚的认识之后再做评判。...
&那为什么目前的公开报道,鲜见对比特币运转机制的分析报道,几乎全部都是谁谁成功了,谁谁入行早现在都多少币了。
发表于:13-12-04 22:43
关注。期待中--------
发表于:13-12-04 22:55
回复chuengkong 因为理解比特币的原理和运行机制需要非常专业的数学和计算机知识,我愿意做一个布道者
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-04 23:56
比特币就是一个试验品
无论是私塾阿三对它的拔高
还是白虎通对它的贬低
都是偏激的
有一句话很多人都知道:在别人疯狂的时候我们恐惧,在别人恐惧的时候我们疯狂。
现在的比特币已经疯狂了
虽然还会有上涨
离场的脚步必须走起了
人民日报说我国粮食亩产几万斤。
哎呀!我传谣了。会不会拘留我?
我好怕呀!!!
发表于:13-12-05 00:38
到家了,没喝多,继续
1976年,两位美国计算机学家Whitfield
Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直
接传递密钥的情况下,完成解密。这被称为diffie-hellman密钥交换算法。这个算法启发了其他科学家。
人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免
了直接传递密钥。
这种新的加密模式被称为"非对称加密算法"。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 09:46
&&[第3版 12-05 09:46]
(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
公钥只能用来加密,用公钥加密的信息,如果再用公钥进行解密,要不需要耗费
大量时间,是实际真实世界的时间,比如100年,或者,解密出N多种结果,你不知道
哪一种结果是原文,那么,这个加密就是安全的。
公钥只能用来加密,无法用来解密,这个概念与我们的直觉相悖,如果理解了这个
概念,就明白了非对称加密的概念。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 00:41
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三
个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张
地说,只要有计算机网络的地方,就有RSA算法。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 00:47
&&[第2版 12-05 00:47]
这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进
制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密
钥基本安全,2048位的密钥极其安全。
前面&CheungKong网友提到,768位RSA密匙被破解,只是在当前计算机计算能力下,通过一种方法在特定条件
下可以实现比穷举法更高效率的计算方法。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 04:22
纸币与黄金关联吗?
好想回到家乡,回到门前池塘
好想回到学校旁边的小路上~
发表于:13-12-05 06:22
占位等后续
喜欢自己百毒不侵的样子
发表于:13-12-05 09:01
&&[第3版 12-05 09:01]
二 RSA算法的数学证明
为了避免此章成为枯燥晦涩的高等数学教学,我尽量把证明通俗化,感兴趣的朋友
可以去搜索相关更专业文章。
1.φ,第二十一个希腊字母,读"佛爱",数学上,是求某一整数的欧拉函数,假设欲求整数N的欧拉函数,
表示方法为φ(n)
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 09:12
&&[第2版 12-05 09:12]
2.欧拉函数
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?
(比如,在1到8之中,有多少个数与8构成互质关系?)
用编程思路就是,A=n-1,countif n与A是否互质,循环n-1次,得出来的数字,就是正整数N
的欧拉函数的值。
3.互质关系
即给定两个正整数A和B,如果除了1以外,A和B没有其他公因子,那么我们就称A和B为互质关系。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 10:01
&&[第4版 12-05 10:01]
4 欧拉定理
欧拉定理的证明我这里就不展开,网上有,这里我只说结论
如果两个正整数a和n互质,则n的欧拉函数
φ(n) 可以让下面的等式成立:
a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。
欧拉定理可以大大简化某些运算。比如,3和10互质,根据欧拉定理,φ(10)=4,
所以3的4次方除以10余数为1,即3的4次方个位数为1,即3的(4的N倍)次方的个位数为1
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 10:17
以下是引用 第9楼 @不倒翁 的话:
比特币就是一个试验品 一个游戏 无论是私塾阿三对它的拔高 还是白虎通对它的贬低 都是偏激的 有一句话很多人都知道:在别人疯狂的时候我们恐惧,在别人恐惧的时候我们疯狂。
现在的比特币已经疯狂了 虽然还会有上涨 但是 离场的脚步必须走起了...
比特币不是货币也不是股票或债券,货币、股票、债券是经济实体发行的,可以正常流通或承兑。比特币就是一串数字或一个概念,是数字游戏或概念游戏,就像以前有人炒卖过月球上的地皮,其实还不如月球上的地皮,因为月球上的地皮是客观存在的。比特币的收益是建立在有下家来买你的比特币,如果没有人接手你的比特币,它就一文不值,不要看电视上说,在有些店可以使用比特币,那是一个套,有点类似传销,又有点象以前有人用假的古董行骗的把戏。
发表于:13-12-05 10:23
5.RSA算法最后一个数学概念,模反函数
如果两个正整数a和n互质,那么一定可以找到整数b,使得
ab-1 被n整除,或者说ab被n除的余数是1。
欧拉定理可以用来证明模反元素必然存在。
可以看到,a的
φ(n)-1 次方,就是a的模反元素。
模反函数不止一个,即如果b是a的模反元素,则 b+kn 都是a的模反元素,k为整数
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 11:24
&&[第2版 12-05 11:24]
6.密钥生成步骤
我们用个例子来帮助大家理解RSA算法密钥的生成过程。
小张想通过RSA算法向小李发送一条加密信息,那么他们应该怎么做呢
首先,小李要随机选择两个质数,比如61和53,我们用字母P和Q代替,
实际运用中两个质数越大,越安全。
然后,计算P和Q的乘积,61x53=3233,设为n
n的长度就是密钥长度。3233写成二进制是,一共有12位,
所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
第三步,计算n的欧拉函数
根据公式 &φ(n) = (p-1)(q-1)
算出φ(3233)等于60×52,即3120
第四步 小李选择一个随机数e,1&e&φ(n),且e与φ(n)互质
小李在1到n=3120之间选择了17=e
第五步 求e对于φ(n)的模反函数,设为d
就是求可以使得ed被φ(n)除的余数为1。
ed ≡ 1 (mod φ(n))
这个式子等价于
ed - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
17x + 3120y = 1
这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。
总之,小李算出一组整数解为
(x,y)=(2753,-15),即 d=2753。
至此所有计算完成。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 11:40
在密钥生成过程中,我们一共得到了六个数字
p、q、n、e、φ(n)、d
p、q是两个随机质数
φ(n)为n的欧拉函数
e是&1,&φ(n),并与φ(n)互质的整数
d是e对于φ(n)的模反函数
然后,n和e,就是小李的公钥,n和d就是小李的私钥
即公钥就是
(3233,17),私钥就是()
实际应用中,公钥和私钥的数据都采用ASN.1格式表达
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 12:08
&&[第2版 12-05 12:08]
8 加密和解密过程
加密用公钥,即(n,e)
即小张想向小李发送信息m,那么如果他用公钥进行加密m,必须满足
条件一:m为整数
条件二:m小于n
在计算机世界里,数字和字符都可以转换成ASCII或unicode映射,所以条件一可以满足
如果,m&n,可以把m分割成若干段直到满足条件二,再进行加密,或者更简单,直接用
对称加密m,然后用RSA加密对称加密的密码字典,都可以满足条件二。
好的,那么小张开始用公钥对信息m进行加密
加密就是计算如下等式
小李的公钥(3233,17),假设小张想发送的信息m为65,那么就是
2790 (mod 3233)
就是计算65的17次方除以3233的余数c
c=2790,加密后的信息就是2790,小张把结果c=2790发给小李
小李收到2790后开始解密
解密需要小李的私钥()
。可以证明,下面的等式一定成立:
c^d&≡ m (mod
也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233,
那么,小李算出
2790^2753&≡ 65 (mod
次方除以3233,得到的余数就是m
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 12:44
9 私钥解密的证明
如何证明用私钥解密一定会得到公钥加密前的信息m
也就是证明
c^d&≡ m (mod n)
根据公钥加密公式
c可以这样表达
将c代入需要证明的公式c^d&≡ m (mod n)
kn)^d&≡ m (mod n)
他等同于求证
ed ≡ 1 (mod φ(n))
ed = hφ(n)+1
m^[hφ(n)+1]≡ m (mod n)
在上面公式中,分两种情况
情况1:m与n互质
根据欧拉定理
m^φ(n)&≡
得到下面公式
(m^φ(n))^h&×
m ≡ m (mod n)
公式得到证明
情况2:m与n不互质
此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:
(kp)^(q-1)&≡ 1 (mod q)
[(kp)^(q-1)]^[h(p-1)]&×
kp ≡ kp (mod q)
(kp)^ed&≡
kp (mod q)
此时t必定能被p整除,即t=t'p
因为 m=kp,n=pq,所以
原式得到证明
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 13:04
10 加密安全性证明
就是证明,用公钥加密的信息无法通过公钥破解
前面第7点在密钥封装时提到,密钥封装过程一共生成6个数字
p、q、n、e、φ(n)、d
(n,e)为公钥,(n,d)为私钥
如果d泄露,即意味着私钥泄露
那么我们要证明加密的安全性,也就是证明通过公钥(n,e)不能够推出d
那么,有没有可能通过公钥推出私钥?
(1)ed≡1
(mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
最后,问题简化为,只有将公钥中的n进行因式分解,才能算出最初的随机质数p和q,也就是
得到私钥关键数字d
结论:如果n可以被因式分解,那么私钥就可以被破解
那么,关于n的因式分解现在是如何做的呢?
到目前为止,n的因式分解除了穷举法(暴力破解)之外别无他法
维基百科是这么说的
"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,
RSA算法愈可靠。
  假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的
可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可
靠的攻击RSA算法的方式。
只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"
举例来说,你可以对3233进行因数分解(61×53),但是你没法对下面这个整数进行因数分解。
它等于以下两个质数之积
    ×
事实上,这大概是人类已经分解的最大整数(232个十进制位,768个二进制位)。
比它更大的因数分解,还没有被报道过,因此目前被破解的最长RSA密钥就是768位。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 13:32
三 非对称加密的运用
除了前面说的RSA算法之外还有Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
等等非对称加密方法
虽然算法不同,但基本原理都是一样的。
非对称加密算法除了加密信息之外,还有一个非常重要的运用,就是可以确认信息的发送者的身份。
因为,用公钥加密的信息,可以用私钥解密,同样我们也可以用私钥加密,用公钥解密
当采取后面一种方式时,信息的接受者可以确认信息确实是由私钥的持有者发出,并且信息发送者
无法抵赖。因为私钥只有他本人拥有。比特币的交易过程中,就用到了这么一种方法。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 02:02
&&[第4版 12-06 02:02]
四hash函数
1.什么是hash函数
又称散列函数,哈希函数
常见的hash算法有,CRC,MD5
和 SHA-1,SHA-256,SHA-512,RIPEMD160等等
比特币系统中大量运用了hash算法如SHA-256、RIPEMD160以确保数据的安全性。
关于散列函数的原理我就不说了,感兴趣的维基或百度
散列函数的作用是,把一段不固定的输入信息,输出为一段长度确定的字符串
散列函数的基本特征是,如果两段信息的hash函数结果不一致,那么这两段信息必定不一致。
那么,如果两段信息不一致,可不可能得出同样的hash值呢?
这是完全可能的,事实上不可避免,学名叫做hash碰撞,一个好的hash函数可以将发生碰撞的可能性
降到最低。
hash函数得到的散列值是不可逆的,即得到散列值,不可能推算出原文(N多解)
2.hash函数的运用
前面说了hash函数的特点,因为hash函数的特点,在验证通讯内容是否被篡改的问题上,hash函数起到了
至关重要的作用,这个校验原文是否被篡改的过程,就被称为hash校验。
3.hash校验
又称冗余校验。
还拿小张和小李打比方,小张想传送一个文件给小李,该文件非常重要,不允许传输过程中出现任何
错误,那么小李如何验证收到的文件准确无误呢?
这时候hash校验就派上了用场,小张先把源文件用hash函数得出散列值,然后小李收到文件后用同样
的hash函数对收到的文件求出散列值,再跟小张的散列值进行比对,如果一致,那么就可以在很高程
度上确定了文件的一致性。(程度的高低取决于hash函数的可靠性)
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 14:14
4.hashcash
这里要特别说一下hashcash概念,这个概念被比特币设计者创造性的用于比特币的工作量证明,
即俗称的挖矿。
hashcash的原理就是,某人要求发给他的信息的散列值必须包含某一段特定字符串,比如散列值前
八位都必须是零,否则我拒绝接受。比如小张对小李提出这样的要求,要求所有发给他的信息得出
的散列值前8位必须是零,小李为了满足小张的要求,必须让计算机在发给小张的信息前添加各种
字符使得散列值碰巧前8位值为零。那么这个工作有没有捷径可走呢?很遗憾没有,计算机必须不
停的在信息前段附加各种数字尝试以得到期望的结果。实际上,小张对散列值前面数字的要求长度,
决定了小李发给小张信息所需要的时间。
那么,hashcash有什么用呢?hashcash最早也是比较广泛的运用是反垃圾邮件。我们知道,垃圾邮件
发送人通过各种渠道收到了大量email地址后,可以用计算机不停的大量的向大量邮件地址发送垃圾
邮件,但是如果你给你的邮箱设置了hashcash规则,那么垃圾邮件发送人就不得不花费一定的时间
才能把邮件发送至你的邮箱(计算hashcash),那怕为此耽误2秒钟,对垃圾邮件发送者来说,也是不可
承受的。因为垃圾邮件发送者可能一次要发送上万封邮件。这样,就避免了垃圾邮件的骚扰。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 14:38
发表于:13-12-05 14:40
五 数字签名
简单的说,就是私钥的所有者,比如小王要给小李发一封电子邮件
小王先用hash函数算出邮件的hash值,即散列值
然后再用自己的私钥对信件的hash值进行加密,得到的数字就是小王的数字签名
附在邮件末尾。
小李收到邮件后,先用小王给他的公钥解密数字签名,然后将得到的hash值与收到的
邮件内容算出的hash值进行比对,如果二者一致,可以确认两点:
1.该邮件确实由小王发出(否则不可以用小王的公钥解密)
2.该邮件内容被篡改的可能性非常小(否则hash值不同)
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 14:41
回复 第28楼 的 @sinner5:
额我的神啊,你布道也不用这样布道啊。你上面这些,随便哪本密码学基础教材的东西都能找到,没意义。
即便你用星际语言编码,我们也不知道你是否真的采用这样编码了,与普通受众何干?我怎知比特币就一定采用1024bit的RSA?
讲讲比特币的发放机制、流转机制、交易机制,基础的密码学和数学范畴不需要讲。
发表于:13-12-05 14:44
回复 第31楼 的 @CheungKong:
你懂不代表别人懂,稍安勿躁
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 15:00
&&[第2版 12-05 15:00]
贰 比特币原理
一 比特币的由来
上个世纪80年代,1982年,大卫.乔姆(David Chaum)提出不可追踪的密码学网络支付系统。
8年后,他将此想法扩展为密码学匿名现金系统,即Ecash。 1998年,戴伟(Wei Dai)的论文
阐述了一种匿名的、分布式的电子现金系统:b-money。
与此同时,Nick Szabo发明了Bitgold,提出工作量证明机制,用户通过竞争性地解决数学难题,
然后将解答的结果用加密算法串联在一起公开发布,构建出一个产权认证系统。Hal Finney则把
该机制完善为一种“可重复利用的工作量证明”。 在前人的工作基础之上,2008年,名不见经
传的Satoshi Nakamoto(中本聪)在的密码学邮件组列表中发表了
《Bitcoin: A Peer-to-Peer Electronic Cash System》(比特币:一种点对点的现金支付系统)。
日,比特币网络诞生,Satoshi Nakamoto(中本聪)本人发布了开源的第一版比特币客户端。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 12:22
&&[第4版 12-06 12:22]
二 设计思想
这里,我引用Satoshi
Nakamoto(中本聪)在《Bitcoin:
A Peer-to-Peer Electronic Cash System》
(比特币:一种点对点的现金支付系统)的原文翻译(谷歌翻译加手工修改,将就着看吧)
“电子商务在互联网上已经发展到了几乎完全依赖于金融机构作为可信的第三方来处理电子付款
的程度。尽管该系统对于大多数交易已经足够了,但仍然遭受来自基于信任模型的固有弱点。
不可能实现完全不可撤销的支付,因为金融机构不可避免的调解纠纷。调解的成本会增加交易
成本,限制了最小实际支付规模和无法实现可能的微小支付。另外,很多商品和服务是无法
退货的,如果缺乏不可撤消的支付手段,交易就会受限。为了防止支付被撤销带来损失,需要
彼此信任。商家必须要警惕他们的客户,
他们需要获得比原本更多的信息并为此困扰。
因为支付有被撤销的可能,一定比例的欺诈交易是不可避免的。这些费用和付款的不确定性可以
在实物交易中避免,但在电子商务中,如果没有可以信赖的通信通道,现有机制无法避免这样的
我们需要的是基于密码学的证明,而不是信任的电子支付系统,允许任意两个自愿交易的各方直接
与对方进行交易,而不需要一个值得信赖第三方。
不可撤销的支付机制将保护卖家避免被欺诈,而日常托管机制可以很容易地实现保障买家。在
本文中,我们提出使用对等网络的分布式时间戳服务器来生成并按照时间先后排列并加以记录的
电子交易证明,解决了重复花费问题。该系统是安全的,只要真实节点共同控制的CPU资源比任何
企图协作攻击节点的cpu资源更多。”
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 18:50
&&[第3版 12-05 18:50]
这里简单谈一下我对Satoshi
Nakamoto(中本聪)比特币的设计思想的理解
1.设计一种支付系统,用于越来越广泛的电子商务应用。
2.这个支付系统跟所有以往的依赖于银行或中间机构的支付系统不同,他不依赖
第三人的信用保障,实现点对点支付,并且不可撤销。
3.为了实现以上目的,所依据的是密码学的证明,而非他人信用。
4.为了避免重复支付,即一笔钱花两次或以上,采用的是分布式对等网络和加盖
交易时间戳的交易记录做为比特币是否合法使用的证明。
5.交易的安全性,取决于这个对等网络支付系统诚实节点控制的cpu资源比黑客或
企图攻击该交易网络的人控制的交易节点的cpu资源更多。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 22:11
&&[第10版 12-05 22:11]
三 交易机制
比特币钱包是比特币客户端随机生成的一对密钥中的公钥,而私钥就是你的钱包密码
前面介绍非对称加密时提到,在非对称加密系统中,公钥是别人给你发信息时的加密工具
在比特币系统中,如果你需要别人支付给你比特币,你就把你的钱包(公钥)发给他,他
就能支付给你比特币。
实际上,为了交易方便,因为公钥太长(130个字符),把公钥进行压缩并加上校验位(防止地址输错)
转为base58编码成为一个34-35位的字符串。这个就叫做钱包地址。
当你需要从你的比特币钱包花钱时,只要用你的私钥加上你想支付对方的钱包地址(对方的
公钥)即可实现付款。
比特币钱包的地址(公钥转换而来)可以随时变换,离线生成,密码(私钥)可以保存在本机,
比如通过比特币客户端,或者通过网站保存在浏览器的java虚拟机中,或者干脆把私钥打印出
来,放在一个安全的地方。只要别人无法获取你的私钥,就无法盗走你的比特币。
那么,可用的比特币钱包地址有多少呢?会不会发生冲突呢?目前比特币客户端设置的钱包地址
为2的128次方,这个数字有多少呢?我们来打个比方,假设地球上所有的沙粒里都有一个地球,
每个地球都有跟我们生活的地球同样多的沙粒,那么比特币钱包地址数量跟这些所有的沙粒的数
量加起来一样多。
比特币钱包生成密钥不是根据常用的前面提到的RSA,而是ECDSA,利用ECC
椭圆曲线算法Elliptic curve&cryptography对DSA数字签名算法的一种模拟
RSA的安全性保证取决于大数的因式分解的困难性
ECC的安全性取决于解决椭圆曲线离散对数问题的困难性。
椭圆曲线密码体制是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。
其时间复杂度是完全指数阶的。
而我们熟知的RSA所利用的是大整数因式分解的困难问题,目前对于一般情况下的因数分解的
最好算法的时间复杂度是子指数阶的,当RSA的密钥使用2048位时,ECC的密钥使用234位所获
得的安全强度还高出许多。它们之间的密钥长度却相差达9倍,当ECC的密钥更大时它们之间差
距将更大。更ECC密钥短的优点是非常明显的,随加密强度的提高,密钥长度变化不大。
在比特币系统中,短私钥的好处是非常明显的,它可以更容易记录、抄写等等
私钥即一切,如不慎弄丢钱包,便永远失去这笔比特币。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 18:24
中新网12月5日电 据央行网站消息,中国人民、工业和信息化部、中国银行业监督管理委员会、中国证券监督管理委员会、中国保险监督管理委员会日前联合印发了《关于防范比特币风险的通知》(以下简称《通知》)。《
通知》要求,比特币是一种特定的虚拟商品,不具有与货币等同的法律地位,不能且不应作为货币在市场上流通使用,普通民众在自担风险的前提下拥有参与的自由,各机构和支付机构不得以比特币为产品或服务定价。
中华人民共和国宪法第三十五条是敏感词!RI!
“自由民主的中国”将是这样一个国家,它的各级政府直至中央政府都
由普遍、平等、无记名的选举所产生,并向选举它的人民负责。它将实
现孙中山先生的三民主义,林肯的民有、民治、民享的原则与罗斯福的
四大自由。它将保证国家的独立、团结、统一及与各民主强国的合作。
(毛zei东:《答路透社记者甘贝尔问》,一九四五年九月二十七日
《新华日报》)
发表于:13-12-05 22:54
&&[第4版 12-05 22:54]
2.比特币和交易
很多人问,比特币是什么,答案是,并没有所谓单个的比特币存在,至少在比特币系统中
没有。比特币系统并不是像我们常用的银行系统一样,标识每一个比特币的所有人。
比特币系统里记录的都是一笔笔的比特币交易,每一笔交易都记录都包含上一笔交易
(钱从哪儿来)的数字签名,加上下一个持有者的公钥(钱到哪儿去)的数字签名,
附加在记录的末尾,即实现了交易的记录和支付。
一个完整的交易流程如下:
首先验证支付钱包地址是否拥有其预支付的比特币数额
这个简单,因为所有合法的交易记录都被记录,如果最近的一次该地址交易记录是有比特币转入
并且数量大于其当前所欲支付的数额,即可确认这笔交易可以被支付。
第二步 计算转出金额和找零,因为你很可能只支付你当前钱包地址所拥有比特币金额的一部分
而非全部,那么在比特币的世界里,钱包地址用过一次后即失去所拥有的比特币(出于匿名需要)
所以,客户端会自动替你生成一个新的钱包地址以便接受找零金额。否则你会失去当前地址所
拥有的全部比特币。早期很多交易命令要手工输入时,曾经就有一个糊涂矿工支付时忘了构建找
零输出,发生过支付200比特币矿工费的人间惨剧。所幸的是,现在由于比特币自身客户端以及
应用的壮大,这种惨剧已经不太可能发生。
倒数第二步,给这笔交易签名
需要多出一个公钥字段,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;
加上即将花费的币所在地址的私钥,用来对交易进行签名。
最后一步就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与
你的节点的网络连接状况。稍后一些时刻,就会进入Block中。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 20:22
长姿势了。谢楼主。
发表于:13-12-05 22:56
&&[第2版 12-05 22:56]
这就是比特币世界中交易记录的关系链条。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-05 22:31
虽然看不懂,但我明白一个道理,比特币不基于信用,而是基于密码。但看不懂,一,既然不存在一堆钱,那怎么知道我拥有多么钱?二,比特币有没一个总数额,基于什么来发行新的数额?三,比特币怎么在生活中应用?
好想回到家乡,回到门前池塘
好想回到学校旁边的小路上~
发表于:13-12-05 22:46
回复 第41楼 的 @一个种玉米的:
等会会讲到
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 00:32
&&[第7版 12-06 00:32]
前面在交易过程中提到比特币交易最后被封装到block(区块)之中,那么这个block的作用是什么呢?
首先,block是由连续的数字来标识的,在比特币世界里称为block的“高度”,第一个数据块(Genesis‎&
Block)被称为创世纪区块。
根据比特币系统的规定,每一个首先封装完成block的人,可以在block索引中加入任意的字符串。
在创世纪区块中,Satoshi
Nakamoto(中本聪)(应该是他无疑)加入了如下字符串
Times 03/Jan/2009 Chancellor on brink of second bailout for banks”
该段文字为英国《泰晤士报》日头版新闻标题:
这段文字暗示了比特币的诞生时间,并从中可以看出Satoshi对现有货币系统的强烈不满。
下面介绍一下block区块的作用
第一,收录交易记录,一旦block记录了在一定时间内(通过工作量证明)的交易记录
一旦到了差不多时间,在比特币世界里大概每10分钟,就有一个新的block被封装,成为存档。
第二, 做存在证明,即证明这笔交易发生的时间。(防止篡改),如果能从数学上证明这笔
交易发生的时间在收集该交易block被封装之前,并且发生在上一个block被封装之后,那这笔
交易从时间上来说是可能的。
比特币具有下列优良的特性可以更完美的用于存在证明:
不可预测/伪造。因block的计算是随机事件,其hash值是一个32字节的随机大数(2^256)。
想蒙对该数的概率实在是太低了。
不可销毁/修改。Block Chain(区块链)拥有巨大的算力在维护与延续,对于N个确认的
block,想篡改是不可能的。block具有天然时间特性。timestamp(时间戳)是block
字段之一。
block可以存储信息。对于block meta信息,是无法控制的。但block会收录交易,而交易
是可以”写入”自己的数据。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 00:40
&&[第2版 12-06 00:40]
第三 工作量证明
前面在介绍hash散列函数时,介绍过hashcash,hashcash可以通过要求特定的hash值(散列值)开头,
来实现对特定数据输入输出的时间控制。在比特币区块的建造过程中,引入了POW(Proof-Of-Work)
机制规则(类似于hashcash),用前一个block的hash值,加上当前所有尚未封装的交易记录,再加上
一个随机数(使得整块数据的hash值具有符合要求的开头),这样的计算需要不断的修改随机数以
符合要求,把每个区块完成的时间被控制在10分钟左右,随着计算机速度和全网算力提升,寻找特定
hash头的速度会变快,那么比特币客户端会自动增加特定hash值的开头的位数,即提高难度,让每个
block建造时间始终维持10分钟左右不变。通过工作量证明封装新的block并得到奖励(下面会提到),
这个过程就称为“挖矿”。
第四 发行比特币
我们知道,所有的比特币交易记录都有上一笔比特币的来源信息,那么最初的比特币来自于哪里呢?
就是来源于block,每个block所记录的第一笔交易都是凭空产生一笔比特币。1-210000区号的block
每个被创建时发行50枚比特币,之后210000个block产生25枚比特币,之后再减半,以此类推。最
后一个产出比特币的区块将是编号为6,929,999的区块,这大约会在公元2140年前后发生。
届时流通中比特币的总数将恒定维持在9
BTC。生产的奖励会从0.&
BTC变为0,然后将不再有新的比特币被生产出来。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 00:27
block chian(区块链)完美的实现了一个牢不可摧永不停息的时间戳交易记录。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 00:30
比特币随时间的流通总量。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 01:17
&&[第3版 12-06 01:17]
4 分布式数据网络
我们最常接触到的分布式数据网络,恐怕就是种子文件了,种子文件是该文件可用下载节点
的索引目录,该种子的目标文件可能保存在多个节点中,并且可能每个节点都只保存一部分,
只要保存该目标文件的节点计算机足够多,就可实现
(1).不需要从专门指定服务器下载该目标文件。
(2).任意一个节点从网络中脱离,不会影响该目标文件的下载。
我们知道,随着比特币系统的运行,交易记录的数据链会越来越长,为了提高效率,每个客户端
只用保存与自己相关的block数据和其他较为久远的block的hash值,仍可以完整的形成block chain
即从比特币诞生起的所有交易记录并不需要每个客户端完整备份,整个网络的其他节点,提供如果
交易所需要的本地没有的block区块下载。
同样的,你可以随时的检验(通过hash值)本地block数据的正确性。
另外,在制作新的block过程中,可能会出现多个block分支,即某些计算机节点认为自己发现了新
的block,并完成封装,继续尝试封装新的block,但过了一段时间,发现有别的节点也生成了同样
高度的block,但并不相同,这时候如何处理?这种选择,在比特币系统中成为best chain
它根据以下原则:
不同高度的分支,总是接受最高(即最长)的那条分支
相同高度的,接受难度最大的(工作量证明)
高度相同且难度一致的,接受时间最早的
若所有均相同,则按照从网络接受的顺序
Chain高度增一,则重新选择Best Chain
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 01:19
按照这个规则运作的节点,称为诚实节点(Honest
Nodes)。节点可以诚实也可以不诚实。
我们假设所有的节点:
可能1:都是理性的,追求收益最大化
可能2:都是不诚实的,且不惜任何手段获取利益
所有节点均独自挖矿不理会其他节点,并将所得收益放入自己口袋,现象就是一个节点挖一个
分支。由于机器的配置总是有差别的,那么算力最强的节点挖得的分支必然是最长的,如果一
个节点的分支不是最长的,意味其收益存在不被认可的风险(即零收益)。为了降低、逃避此
风险,一些节点肯定会联合起来一起挖某个分支,试图成为最长的分支或保持最长分支优势。
一旦出现有少量的节点联合,那么其他节点必然会效仿,否则他们收益为零的风险会更大。于
是,分支迅速合并汇集,所有节点都会选择算力更强的分支,只有这样才能保持收益风险最小。
最终,只会存在一个这样的分支,就是主干分支(Best/Main
对于不诚实节点来说,结局是无奈的:能且只能加入主干挖矿。不加入即意味被抛弃,零收益;
加入就是老实干活,按占比分成。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 01:22
分支图,绿色的是Genesis‎&Block,黑色的是best chain,灰色的是曾经出现后被丢弃的block
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
发表于:13-12-06 01:24
算力攻击的概率
算力攻击是一个概率问题,这里作简单叙述:由于block的链式形式,随着块数的上升,
攻击者赢得的概率呈指数下降。这是很多应用等待六个甚至六个以上确认的原因,一旦
超过N个确认,攻击者得逞的可能微乎其微,概率值快速趋近零。
当攻击者的算力超过50%时,便可以控制Block
Chain,俗称51%攻击。
1.不要跟弱势群体对立
2.不要跟弱智群体站太近
赠诸君共勉!
共2页 到第页
你尚未登录或可能已退出账号:(请先或者
【敬请阅读】
亲爱的网友们,、有更新哦!
请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任将以粗体标识,您应重点阅读。
【特别提示】
如您继续使用我们的服务,表示您已充分阅读、理解并接受《西祠站规》、《西祠胡同用户隐私保护政策》的全部内容。阅读《西祠站规》、《西祠胡同用户隐私保护政策》的过程中,如果您有任何疑问,可向平台客服咨询。如您不同意《西祠站规》、《西祠胡同用户隐私保护政策》的任何条款,可立即停止使用服务。
南京西祠信息技术股份有限公司
我已阅读并同意、中的全部内容!

我要回帖

更多关于 比特币交易系统源码 的文章

 

随机推荐