上海丙赟信息科技有限责任公司


  • 首页

  • 关于

  • 归档

股360网 V1.0

发表于 2018-08-27 | 阅读次数:

业务用例

操盘

平仓

比特币源码阅读(0.16)(二)

发表于 2018-08-18 | 阅读次数:

init.cpp::AppInitMain

比特币源码阅读(0.16)(一)

发表于 2018-08-18 | 阅读次数:

bitcoind.cpp::main

比特币源码阅读(0.16)(四)

发表于 2018-07-23 | 阅读次数:

chainparams.cpp::CreateGenesisBlock

可以使用工具生成创世块的参数

  1. https://github.com/lhartikk/GenesisH0
  2. https://github.com/nasa8x/node-genesis-block
  3. https://github.com/nasa8x/genesis-block
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
//用一条当天新闻表示之前没有偷挖过矿
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";

//创世块中,这个值没有什么具体用途,只要是个唯一的值就可以了,不一定需要是私钥。
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;

return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}


static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
//被广播到网络上和打包进区块的基本的交易结构,一个交易可以有多个的输入和输出
//区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易。
CMutableTransaction txNew;
txNew.nVersion = 1;
//1个输入
txNew.vin.resize(1);
//1个输出
txNew.vout.resize(1);
//与常规交易不同,创币交易没有输入,不消耗UTXO。它只包含一个被称作coinbase的输入,仅仅用来创建新的比特币。
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
//创币交易有一个输出,支付到这个矿工的比特币地址。
txNew.vout[0].nValue = genesisReward;
txNew.vout[0].scriptPubKey = genesisOutputScript;

CBlock genesis;
//创世块生成的UNIX时间
genesis.nTime = nTime;
//挖矿的过程,就是寻找数字,来使得区块的HASH值小于nBits所指定的难度目标
genesis.nBits = nBits;
//挖矿的目标是找到一个使区块头哈希值小于难度目标的 nonce。挖矿节点通常需要尝试数十亿甚至数万亿个不同的nonce取值,直到找到一个满足条件的nonce值。.
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull();

//在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,
//且提供了一种校验区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,
//并将新生成的哈希节点插入到Merkle树中,直到只剩一个哈希节点,该节点就是Merkle树的根。
//在比特币的Merkle树中两次使用到了SHA256 算法,因此其加密哈希算法也被称为double-SHA256。
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);

return genesis;
}

比特币源码阅读(0.16)(五)

发表于 2018-07-23 | 阅读次数:

base58.h

Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/“符号。
设计Base58主要的目的是:

  • 避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
  • 不使用”+”和”/“的原因是非字母或数字的字符串作为帐号较难被接受。
  • 没有标点符号,通常不会被从中间分行。
  • 大部分的软件支持双击选择整个字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/**
* Base class for all base58-encoded data
*/
class CBase58Data
{
protected:
//! the version byte(s)
std::vector<unsigned char> vchVersion;

//! the actually encoded data
typedef std::vector<unsigned char, zero_after_free_allocator<unsigned char> > vector_uchar;
vector_uchar vchData;

CBase58Data();
void SetData(const std::vector<unsigned char> &vchVersionIn, const void* pdata, size_t nSize);
void SetData(const std::vector<unsigned char> &vchVersionIn, const unsigned char *pbegin, const unsigned char *pend);

public:
bool SetString(const char* psz, unsigned int nVersionBytes = 1);
bool SetString(const std::string& str);
std::string ToString() const;
int CompareTo(const CBase58Data& b58) const;

bool operator==(const CBase58Data& b58) const { return CompareTo(b58) == 0; }
bool operator<=(const CBase58Data& b58) const { return CompareTo(b58) <= 0; }
bool operator>=(const CBase58Data& b58) const { return CompareTo(b58) >= 0; }
bool operator< (const CBase58Data& b58) const { return CompareTo(b58) < 0; }
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; }
};

比特币源码阅读(0.16)(七)

发表于 2018-07-23 | 阅读次数:

MAC上编译bitcoin

安装 XCode 命令行工具

xcode-select –install

安装Brew,本来想升级一下,但是很长时间没有响应,就重新安装了

/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

使用Brew安装第三方工具和库

brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python qt libevent qrencode

从github下载0.16版本bitcoin,解压到bitcoin目录

https://github.com/bitcoin/bitcoin/tree/0.16

编译代码

新建Terminal窗口,进入上一步创建的bitcoin目录中,执行如下命令,然后长时间的等待
./autogen.sh
./configure
make

区块牛业务模型(V1.2)

发表于 2018-07-19 | 阅读次数:

区块牛用例(红包)

发表于 2018-07-19 | 阅读次数:

城市绿色再生资源供应链管理服务平台 V1.0

发表于 2018-07-19 | 阅读次数:

用例

业务模型

入库用例

入库单状态

数字签名

发表于 2018-07-17 | 阅读次数:

什么是数字签名

数字签名是带有秘钥(公钥和私钥)的摘要信息算法,它和摘要算法用途一样,用于验证数据来源、数据完整性和抗否认性等,私钥签名,公钥验证。常用的签名算法有RSA、DSA和ECDSA。经典的RSA数字签名算法广泛的使用,就形成了DSS(Digital Signature Standard)标准,而DSA(Digital Signature Algorithm)是对标准的实现,DSA只能实现签名,而RSA既可以签名,也可以加解密,这是他们最大的区别。ECDSA是微软贡献的签名算法,全称是Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法,具有速度快,强度高,签名短的特点。

什么是椭圆曲线数字签名算法(ECDSA)

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。因此椭圆曲线密码的单位比特强度要高于其他公钥体制。

签名过程如下:

1、选择一条椭圆曲线Ep(a,b),和基点G;
2、选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG;
3、产生一个随机整数r(r<n),计算点R=rG;
4、将原数据和点R的坐标值x,y作为参数,计算SHA1做为hash,即Hash=SHA1(原数据,x,y);
5、计算s≡r - Hash * k (mod n)
6、r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行

验证过程如下:

1、接受方在收到消息(m)和签名值(r,s)后,进行以下运算
2、计算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。
3、验证等式:r1 ≡ r mod p。
4、如果等式成立,接受签名,否则签名无效。

nodejs 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var crypto = require('crypto');

var keys = {
priv: '-----BEGIN EC PRIVATE KEY-----\n' +
'MHcCAQEEIF+jnWY1D5kbVYDNvxxo/Y+ku2uJPDwS0r/VuPZQrjjVoAoGCCqGSM49\n' +
'AwEHoUQDQgAEurOxfSxmqIRYzJVagdZfMMSjRNNhB8i3mXyIMq704m2m52FdfKZ2\n' +
'pQhByd5eyj3lgZ7m7jbchtdgyOF8Io/1ng==\n' +
'-----END EC PRIVATE KEY-----\n',
pub: '-----BEGIN PUBLIC KEY-----\n' +
'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEurOxfSxmqIRYzJVagdZfMMSjRNNh\n' +
'B8i3mXyIMq704m2m52FdfKZ2pQhByd5eyj3lgZ7m7jbchtdgyOF8Io/1ng==\n' +
'-----END PUBLIC KEY-----\n'
};

var data = new Buffer('hello');

var sign = crypto.createSign('ecdsa-with-SHA1');
sign.update(data);
var signature = sign.sign(keys.priv);

console.log(signature);

var verify = crypto.createVerify('ecdsa-with-SHA1');
verify.update(data);
console.log(verify.verify(keys.pub, signature));
12…4

李蔚海

33 日志
1 分类
1 标签
RSS
E-Mail
© 2018 李蔚海
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4