Base58Check Encode/Decode Destination 示例

Base58Check Encode/Decode Destination 示例

Bitcoin(0.16.0)编码/解码地址定义如下:

// 编码
std::string EncodeDestination(const CTxDestination& dest)
{
    return boost::apply_visitor(DestinationEncoder(Params()), dest);
}
// 解码
CTxDestination DecodeDestination(const std::string& str)
{
    return DecodeDestination(str, Params());
}
namespace
{
class DestinationEncoder : public boost::static_visitor
{
private:
    const CChainParams& m_params;

public:
    DestinationEncoder(const CChainParams& params) : m_params(params) {}
	// P2PK
    std::string operator()(const CKeyID& id) const
    {
        std::vector data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
        data.insert(data.end(), id.begin(), id.end());
        return EncodeBase58Check(data);
    }
	// P2SH
    std::string operator()(const CScriptID& id) const
    {
        std::vector data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
        data.insert(data.end(), id.begin(), id.end());
        return EncodeBase58Check(data);
    }

    std::string operator()(const WitnessV0KeyHash& id) const
    {
        std::vector data = {0};
        ConvertBits<8, 5, true>(data, id.begin(), id.end());
        return bech32::Encode(m_params.Bech32HRP(), data);
    }

    std::string operator()(const WitnessV0ScriptHash& id) const
    {
        std::vector data = {0};
        ConvertBits<8, 5, true>(data, id.begin(), id.end());
        return bech32::Encode(m_params.Bech32HRP(), data);
    }

    std::string operator()(const WitnessUnknown& id) const
    {
        if (id.version < 1 || id.version > 16 || id.length < 2 || id.length > 40) {
            return {};
        }
        std::vector data = {(unsigned char)id.version};
        ConvertBits<8, 5, true>(data, id.program, id.program + id.length);
        return bech32::Encode(m_params.Bech32HRP(), data);
    }

    std::string operator()(const CNoDestination& no) const { return {}; }
};

CTxDestination DecodeDestination(const std::string& str, const CChainParams& params)
{
    std::vector data;
    uint160 hash;
    if (DecodeBase58Check(str, data)) {
        // base58-encoded Bitcoin addresses.
        // Public-key-hash-addresses have version 0 (or 111 testnet).
        // The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key.
        const std::vector& pubkey_prefix = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
        if (data.size() == hash.size() + pubkey_prefix.size() && std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin())) {
            std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.begin());
            return CKeyID(hash);
        }
        // Script-hash-addresses have version 5 (or 196 testnet).
        // The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
        const std::vector& script_prefix = params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
        if (data.size() == hash.size() + script_prefix.size() && std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) {
            std::copy(data.begin() + script_prefix.size(), data.end(), hash.begin());
            return CScriptID(hash);
        }
    }
    data.clear();
    auto bech = bech32::Decode(str);
    if (bech.second.size() > 0 && bech.first == params.Bech32HRP()) {
        // Bech32 decoding
        int version = bech.second[0]; // The first 5 bit symbol is the witness version (0-16)
        // The rest of the symbols are converted witness program bytes.
        if (ConvertBits<5, 8, false>(data, bech.second.begin() + 1, bech.second.end())) {
            if (version == 0) {
                {
                    WitnessV0KeyHash keyid;
                    if (data.size() == keyid.size()) {
                        std::copy(data.begin(), data.end(), keyid.begin());
                        return keyid;
                    }
                }
                {
                    WitnessV0ScriptHash scriptid;
                    if (data.size() == scriptid.size()) {
                        std::copy(data.begin(), data.end(), scriptid.begin());
                        return scriptid;
                    }
                }
                return CNoDestination();
            }
            if (version > 16 || data.size() < 2 || data.size() > 40) {
                return CNoDestination();
            }
            WitnessUnknown unk;
            unk.version = version;
            std::copy(data.begin(), data.end(), unk.program);
            unk.length = data.size();
            return unk;
        }
    }
    return CNoDestination();
}
} // namespace

其中Params的定义如下:

static std::unique_ptr globalChainParams;

const CChainParams &Params() {
    assert(globalChainParams);
    return *globalChainParams;
}

在编码/解码前,需要选择CChainParams,如选择主网参数:

SelectParams(CBaseChainParams::MAIN);

主网参数CMainParams的定义如下:

/**
 * Main network
 */
/**
 * What makes a good checkpoint block?
 * + Is surrounded by blocks with reasonable timestamps
 *   (no blocks before with a timestamp after, none after with
 *    timestamp before)
 * + Contains no strange transactions
 */

class CMainParams : public CChainParams {
public:
    CMainParams() {
        strNetworkID = "main";
        consensus.nSubsidyHalvingInterval = 210000;
        consensus.BIP16Height = 173805; // 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - April 1, 2012
        consensus.BIP34Height = 227931;
        consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
        consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0
        consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931
        consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
        consensus.nPowTargetSpacing = 10 * 60;
        consensus.fPowAllowMinDifficultyBlocks = false;
        consensus.fPowNoRetargeting = false;
        consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
        consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
        consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
        consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
        consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

        // Deployment of BIP68, BIP112, and BIP113.
        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016
        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017

        // Deployment of SegWit (BIP141, BIP143, and BIP147)
        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;
        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.
        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1510704000; // November 15th, 2017.

        // The best chain should have at least this much work.
        consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000f91c579d57cad4bc5278cc");

        // By default assume that the signatures in ancestors of this block are valid.
        consensus.defaultAssumeValid = uint256S("0x0000000000000000005214481d2d96f898e3d5416e43359c145944a909d242e0"); //506067

        /**
         * The message start string is designed to be unlikely to occur in normal data.
         * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
         * a large 32-bit integer with any alignment.
         */
        pchMessageStart[0] = 0xf9;
        pchMessageStart[1] = 0xbe;
        pchMessageStart[2] = 0xb4;
        pchMessageStart[3] = 0xd9;
        nDefaultPort = 8333;
        nPruneAfterHeight = 100000;

        genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
        consensus.hashGenesisBlock = genesis.GetHash();
        assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
        assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

        // Note that of those which support the service bits prefix, most only support a subset of
        // possible options.
        // This is fine at runtime as we'll fall back to using them as a oneshot if they dont support the
        // service bits we want, but we should get them updated to support all service bits wanted by any
        // release ASAP to avoid it where possible.
        vSeeds.emplace_back("seed.bitcoin.sipa.be"); // Pieter Wuille, only supports x1, x5, x9, and xd
        vSeeds.emplace_back("dnsseed.bluematt.me"); // Matt Corallo, only supports x9
        vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org"); // Luke Dashjr
        vSeeds.emplace_back("seed.bitcoinstats.com"); // Christian Decker, supports x1 - xf
        vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch"); // Jonas Schnelli, only supports x1, x5, x9, and xd
        vSeeds.emplace_back("seed.btc.petertodd.org"); // Peter Todd, only supports x1, x5, x9, and xd

        base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,0);
        base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,5);
        base58Prefixes[SECRET_KEY] =     std::vector(1,128);
        base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};
        base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};

        bech32_hrp = "bc";

        vFixedSeeds = std::vector(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));

        fDefaultConsistencyChecks = false;
        fRequireStandard = true;
        fMineBlocksOnDemand = false;

        checkpointData = {
            {
                { 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")},
                { 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")},
                { 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")},
                {105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")},
                {134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")},
                {168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")},
                {193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")},
                {210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")},
                {216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")},
                {225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")},
                {250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")},
                {279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")},
                {295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")},
            }
        };

        chainTxData = ChainTxData{
            // Data as of block 0000000000000000002d6cca6761c99b3c2e936f9a0e304b7c7651a993f461de (height 506081).
            1516903077, // * UNIX timestamp of last known number of transactions
            295363220,  // * total number of transactions between genesis and that timestamp
                        //   (the tx=... number in the SetBestChain debug.log lines)
            3.5         // * estimated number of transactions per second after that timestamp
        };
    }
};

测试程序如下:

// Base58Check Encode/Decode Destination
int main_bs58check(){
	// 选择主网参数 
	SelectParams(CBaseChainParams::MAIN);
	// 设置测试密钥
	CKey priKey;
	CPubKey pubKey;
	priKey.Set(TestPriKey.begin(), TestPriKey.end(), true);
	pubKey.Set(TestPubKey.begin(), TestPubKey.end());
	CKeyID address = pubKey.GetID(); 
	// 打印公钥ID
	std::cout<<"**** Pubkey ID:";
	print_vector(address.begin(), address.size());
	// 打印编码的比特币地址 
	std::cout<<"**** Encode Destination ****"<
                    
                    
  • 排队论和区块链学术研究 lisoleg
    Queueinganalysisoftransaction=confirmationtimeinbitcoinBlockchainQueueingTheory
  • 【白皮书系列】以太坊白皮书(比特币篇) 9abda844c1aa
    本来想再看一遍《精通比特币》,没想到打印的前面的一部分放在公司没有拿回来,也就看看以太坊的白皮书吧。好在以太坊白皮书前面的部分是对历史的回顾,主要是聊比特币,所以,就趁着比特币白皮书刚看完,把这一部分看了,进行一个梳理把。[0.摘要][译文]向世界引入了两种未经测试的革命性的新概念。第一种就是比特币(bitcoin),一种去中心化的点对点的网上货币,在没有任何资产担保、内在价值或者中心发行者的情况
  • 比特币源码分析:任务调度器的使用 姜家志
    任务调度器Bitcoin进程启动后,有一个专门的线程做任务调度,这些任务根据指定的时刻,执行对应的函数:boolAppInitMain(){.......//StartthelightweighttaskschedulerthreadCScheduler::FunctionserviceLoop=boost::bind(&CScheduler::serviceQueue,&scheduler);t
  • 基于BitVM的乐观 BTC bridge mutourend 比特币比特币
    1.引言前序博客:区块链互操作协议BitcoinBridge:治愈还是诅咒?BitVM:Bitcoin的链下合约基于BitVM的乐观BTCbridge:Trust-minimizedtwo-waypeg机制BitVMBTCbridge背后的主要思想是:为比特币全节点创建仅使用比特币脚本来操作sidechainbridgeprogram的方式,包括sidechainlightclient。虽然众所周
  • 区块链技术架构 java_《区块链底层设计Java实战》之第二章区块链架构 张林威 区块链技术架构java
    第2章区块链架构会当凌绝顶一览众山小正如开篇所言:会当凌绝顶,一览众山小。进入区块链底层开发前,我们需要了解区块链底层的通用架构是如何设计的,从上而下地审视区块链底层的结构,做到了然于胸,才能胸有成竹。他山之石,可以攻玉。在介绍区块链底层通用架构之前,我们不妨先从比特币、以太坊、Hyperledger的架构解读开始。2.1比特币架构根据中本聪的论文“Bitcoin:APeer-to-PeerEle
  • NFTScan 正式上线 Mantle NFTScan 浏览器和 NFT API 数据服务 nft区块链
    2024年2月1号,NFTScan团队正式对外发布了MantleNFTScan浏览器,将为Mantle生态的NFT开发者和用户提供简洁高效的NFT数据搜索查询服务。NFTScan作为全球领先的NFT数据基础设施服务商,Mantle是继Bitcoin、Ethereum、BNBChain、Polygon、Solana、Arbitrum、Optimism、Aptos等区块链之后,NFTScan浏览器支持
  • 美国突然致敬中本聪 碳链价值
    作者:秦晋有点看不懂美国的神操作。2月16日,据《BitcoinMagazine》报道,比特币的竞争对手、美国参议员伊丽莎白-沃伦对比特币的立场突然180度大转弯。由反对立场转为支持立场。让很多行业媒体出乎意料,甚至惊掉下巴。报道称,参议员伊丽莎白-沃伦多年来一直诋毁比特币是犯罪分子、恐怖分子和气候变化否认者的常用货币之后,在比特币发布15周年之际,期望在国会大厦上空升起一面由纽约市议会揭幕的纪念
  • 分层钱包HD钱包 朱雀333 区块链
    bc1开头的通常指的是比特币(Bitcoin)的地址,这种格式遵循了比特币改进提案BIP0173中定义的Bech32编码格式。Bech32地址也被称为"SegWit"地址,它们支持SegregatedWitness功能,这是比特币网络为了提高区块链效率和扩展性而实施的一项升级。Bech32地址通常以bc1q开头,后面跟着一串小写字母和数字。这种地址格式具有几个优点,包括:错误检测能力更强:Bech
  • 区块链相关术语 问心2018
    地址:比特币地址(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和数字组成。它其实是通过对160位二进制公钥哈希值进行base58check编码后的信息。就像别人向你的email地址发送电子邮件一样,他可以通过你的比特币地址向你发送比特币。bip:比特币改进提议(BitcoinImprovementProposals的缩写),指比特币社区成员所提交的一系列改
  • linux 编译bitcoin,bitcoin: 使用gitian编译并发布 姜饼人儿 linux编译bitcoin
    免责声明:本人省略了很多细节gitian是什么我们开发软件都希望更多的人使用,一款软件可能会兼容很多的操作平台,例如Windows,MacOs,众多的Linux版本,甚至还有ARM,Bitcoin也是如此.bitcoin做为一款开源软件,有众多的贡献者,为了保证能在各个系统中能编译出安全稳定的版本,BitcoinCore设计了Gitian.Gitian不是一个主流的解决方案,基本就是Bitcoin
  • 区块链系统:什么是私钥? FAFU_kyp 区块链技术与应用区块链javascript开发语言
    在比特币中,私钥本质上就是一个256位的随机整数。我们以JavaScript为例,演示如何创建比特币私钥。在JavaScript中,内置的Number类型使用56位表示整数和浮点数,最大可表示的整数最大只有9007199254740991。其他语言如Java一般也仅提供64位的整数类型。要表示一个256位的整数,只能使用数组来模拟。bitcoinjs使用bigi这个库来表示任意大小的整数。下面的代
  • The countdown of bitcoin mining: 4 million is left aboutcryptocurrency
    SinceJanuary,2009,thefirstbitcoinhasbeenmined.Itcostabout200daystomine1millionbitcoins,whileitcostover500daystosupply17millionbitcoins.ItisreportedbyCNBCthatthesurplusbitcoinswillbeminedinthenext122ye
  • Why haven’t bitcoin become a common payment option? aboutcryptocurrency cryptocurrencybitcoin
    Astherepresentativeofdigitalcurrencies,bitcoinvalueanditsmarketcapwasunstableinrecentyears.Meanwhile,theargumentaboutthecurrencyattributeofbitcoinneverstop.However,itisnodoubtthatbitcoinhaven’tbecomea
  • Bitcoin Bridge:治愈还是诅咒? mutourend 比特币比特币
    1.引言主要参考:BitcoinBridges:CureorCurse?2.为何需关注Bitcoinbridge?当前的Bitcoinbridge,其所谓bridge,实际是deposit:在其它链上的BTC情况为:尽管当前约有43.7万枚BTC在其它链上,但其去中心化程度不足0.3%。3.Bitcoinbridge101Bitcoinbridge的目标是:将BTC存入某appchain(“app
  • 昨日晚间快讯.行情解读1.6 豆子丁
    图片发自App晚间快讯:据CCN消息,BloombergIntelligence分析师MikeMcGlone表示,加密资产的熊市极有可能在2019年前两个季度延续。比特币近期的价格上涨只是熊市里的短期反弹,抛售减少是是造成这次反弹的原因之一,现在还很难说是熊市的最后阶段。据Bitcoin.com消息,瑞士前财政部长UeliMaurer已开始担任瑞士联邦主席一职。据悉,UeliMaurer在2018
  • mastering bitcoin 读书小记 卜将就
    开卷有益,小韭菜本着对比特币具体实现的好奇心,这周翻完了《MasteringBitcoin》。书的信息量很大,一遍读完感觉也是不能完全跟上作者的思路,但这本确实可以说是熟悉区块链等相关知识的绝佳入门书了,虽然可能对非程序员不是特别友好。以下是读书时和读完后的一些记录和思考。以后有时间的话,肯定会继续刷的,因为其中的具体算法和实现,其实第一遍都跳过了,以求对它的全貌有一个快速的认识和理解。书的第一章
  • 2万字曝光:华尔街疯狂抢购比特币背后 碳链价值 区块链
    作者/来源:MarkGoodwinandwhitneyWebb@BitcoinMagazine编译:秦晋全文:19000余字在最近比特币ETF获得批准之后,贝莱德的拉里-芬克透露,很快所有东西都将被「ETF化」与代币化,不仅威胁到现有的资产和商品,而且也威胁到自然世界的碎片化,使大多数生物沦为华尔街的金融产品,在一个单一的通用的分布式账上进行交易。就在1月11日美国证券交易委员会批准了11只比特币
  • 每日推荐06.06 西瓜绿2020
    分享时下比较流行的优秀国外设计,每日开眼一下;数量四组,每日积累一点点,提高设计审美!#小程序#UI01.加密货币交易应用程序UI套件https://www.uplabs.com/posts/bitcoin-cryptocurrency-trading-app-ui-kit02.多个移动应用程序UI设计https://www.uplabs.com/posts/mobile-app-mockup-1
  • 比特币源码分析系列3---区块block数据结构 JC86
    bitcoin版本:0.16.2区块结构分析区块是组成区块链的基本单位,可以通过bitcoin-cli命令查看一个区块的基本信息区块block的数据结构如下图(存储方式为小端):block数据结构整体结构数据项大小(Byte)描述BlockSize4区块大小BlockHeader80区块头信息大小Transactionsm*n(n>=250)所有交易的列表TransactionsCounter1-
  • 比特币直面灰度“抛压”?GBTC外流规模及时间线分析 陀螺财经 区块链人工智能
    作者/DAVIDBAILEY、SPENCERNICHOLS编译/Ning以下是《BitcoinMagazine》对GBTC流出量的简要分析,并非是严格意义上的数学计算,仅作为资料让投资者从宏观角度了解当前GBTC的抛售状况,并预估未来可能的资金流出规模。01资金外流的灰度,净流入的比特币ETF2024年1月25日——自比特币现货ETF通过以来,市场陷入了抛售漩涡,始作俑者并非他人,正是曾经全球最大
  • 比特币的治理 blockcoach 区块链
    号外:教链内参2.2《美非农就业强劲超预期!》文|PierreRochard.原标题:BitcoinGovernance.2018.7.8我们为什么在意?比特币的治理(governance)之所以重要,是因为比特币是第一个成功的、流动性最强的、最广为人知的加密货币。用MichaelGoldstein的话说,“健全的货币是文明的基础支柱,比特币重拾了这一强大的社会协调工具。”如果比特币的治理模式存在
  • 是时候结束澳本聪对比特币开发者的骚扰活动了 blockcoach 区块链
    号外:教链内参2.5《美联储当头浇了市场一盆冷水》文|PaulGrewal,coinbase首席法务官.原文标题:TimetoEndCraigWright’sHarassmentCampaignAgainstBitcoinDevs.2024.2.1译者按:在“澳本聪”CraigWright自称中本聪并接连动用法律诉讼等手段威胁比特币核心开发人员迫使他们离开比特币的技术维护工作多年之后,业界终于忍无
  • python脚本调用对应btcoin-cli 接口 yunson_Liu ordinalspythonpythonordinals
    #!/usr/bin/python3fromflaskimportFlask,request,jsonifyimportsubprocessimportreimportloggingapp=Flask(__name__)classBitcoinWallet:def__init__(self,bitcoin_cli_cmd):self.bitcoin_cli_cmd=bitcoin_cli_cmdd
  • 区块链实战:用python编写最简单的比特币区块链本地测试框架 thinkerhui 编程区块链区块链python链表
    区块链实战:用python编写简单的比特币区块链本地测试框架前言比特币本身并不是特别复杂,中本聪的白皮书只有十页左右。可从该链接下载(有各种语言版本):Bitcoin:APeer-to-PeerElectronicCashSystem但是,真正投入使用的比特币系统实际上非常复杂,包含诸多因素,涉及诸多细节,甚至对一个手续费机制研究几天还云里雾里。如何有效地学习理解比特币的框架?如果只是看了理论,觉
  • 区块链溯源的潜在影响:供应链管理的革命 禅与计算机程序设计艺术 区块链
    1.背景介绍区块链技术的诞生与发展区块链技术起源于2008年,当时一位使用伪onym的程序员发表了一篇论文,标题为:“Bitcoin:APeer-to-PeerElectronicCashSystem”。这篇论文提出了一种新的数字货币系统,它的核心特点是去中心化、透明度、不可篡改等特点。随后,这种数字货币系统被实现并发布,被称为比特币(Bitcoin)。区块链技术是比特币系统的基础设施,它是一种分
  • mondb入手 木zi_鸣 mongodb
    windows 启动mongodb  编写bat文件, mongod --dbpath D:\software\MongoDBDATA mongod --help  查询各种配置 配置在mongob 打开批处理,即可启动,27017原生端口,shell操作监控端口  扩展28017,web端操作端口 启动配置文件配置, 数据更灵活 
  • 大型高并发高负载网站的系统架构 bijian1013 高并发负载均衡
            扩展Web应用程序 一.概念         简单的来说,如果一个系统可扩展,那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集,并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种:         1.
  • DISPLAY变量和xhost(原创) czmmiao display
    DISPLAY 在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0
  • 获取B/S客户端IP 周凡杨 java编程jspWeb浏览器
       最近想写个B/S架构的聊天系统,因为以前做过C/S架构的QQ聊天系统,所以对于Socket通信编程只是一个巩固。对于C/S架构的聊天系统,由于存在客户端Java应用,所以直接在代码中获取客户端的IP,应用的方法为:    String ip = InetAddress.getLocalHost().getHostAddress(); 然而对于WEB
  • 浅谈类和对象 朱辉辉33 编程
        类是对一类事物的总称,对象是描述一个物体的特征,类是对象的抽象。简单来说,类是抽象的,不占用内存,对象是具体的, 占用存储空间。     类是由属性和方法构成的,基本格式是public  class 类名{ //定义属性 private/public 数据类型 属性名; //定义方法 publ
  • android activity与viewpager+fragment的生命周期问题 肆无忌惮_ viewpager
    有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。 第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。 super.onResume(); bindService(intent, conn, BIND_AUTO_CREATE);
  • base64Encode对图片进行编码 843977358 base64图片encoder
    /** * 对图片进行base64encoder编码 * * @author mrZhang * @param path * @return */ public static String encodeImage(String path) { BASE64Encoder encoder = null; byte[] b = null; I
  • Request Header简介 aigo servlet
    当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request   Header)   用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:    
  • HttpClient4.3 创建SSL协议的HttpClient对象 alleni123 httpclient爬虫ssl
    public class HttpClientUtils { public static CloseableHttpClient createSSLClientDefault(CookieStore cookies){ SSLContext sslContext=null; try { sslContext=new SSLContextBuilder().l
  • java取反 -右移-左移-无符号右移的探讨 百合不是茶 位运算符 位移
    取反: 在二进制中第一位,1表示符数,0表示正数 byte a = -1; 原码:10000001 反码:11111110 补码:11111111 //异或: 00000000 byte b = -2; 原码:10000010 反码:11111101 补码:11111110 //异或: 00000001
  • java多线程join的作用与用法 bijian1013 java多线程
            对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means t
  • Java发送http请求(get 与post方法请求) bijian1013 javaspring
    PostRequest.java package com.bijian.study; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURL
  • 【Struts2二】struts.xml中package下的action配置项默认值 bit1129 struts.xml
    在第一部份,定义了struts.xml文件,如下所示:   <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts
  • 【Kafka十三】Kafka Simple Consumer bit1129 simple
    代码中关于Host和Port是割裂开的,这会导致单机环境下的伪分布式Kafka集群环境下,这个例子没法运行。 实际情况是需要将host和port绑定到一起,   package kafka.examples.lowlevel; import kafka.api.FetchRequest; import kafka.api.FetchRequestBuilder; impo
  • nodejs学习api ronin47 nodejs api
    NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了docum
  • java-64.寻找第N个丑数 bylijinnan java
    public class UglyNumber { /** * 64.查找第N个丑数 具体思路可参考 [url] http://zhedahht.blog.163.com/blog/static/2541117420094245366965/[/url] * 题目:我们把只包含因子 2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14
  • 二维数组(矩阵)对角线输出 bylijinnan 二维数组
    /** 二维数组 对角线输出 两个方向 例如对于数组: { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 }, slash方向输出: 1 5 2 9 6 3 13 10 7 4 14 11 8 15 12 16 backslash输出: 4 3
  • [JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新) comsci 工作流
       既然是做开源软件的,我们的宗旨就是给大家分享设计和代码,那么现在我就用很简单扼要的语言来透露这个跳跃模式的设计原理    大家如果用过JWFD的ARC-自动运行控制器,或者看过代码,应该知道在ARC算法模块中有一个函数叫做SAN(),这个函数就是ARC的核心控制器,要实现跳跃模式,在SAN函数中一定要对LN链表数据结构进行操作,首先写一段代码,把
  • redis常见使用 cuityang redis常见使用
    redis 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets 引入jar包 jedis-2.1.0.jar  (本文下方提供下载) package redistest; import redis.clients.jedis.Jedis; public class Listtest
  • 配置多个redis dalan_123 redis
    配置多个redis客户端 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi=&quo
  • attrib命令 dcj3sjt126com attr
      attrib指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统.    只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的写保护.    存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件. 
  • Yii使用公共函数 dcj3sjt126com yii
    在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便。 在入口文件index.php里添加 require_once('protected/function.php'); 即可对其引用,成为公用的函数集合。 function.php如下:   <?php /**   * This is the shortcut to D
  • linux 系统资源的查看(free、uname、uptime、netstat) eksliang netstatlinux unamelinux uptimelinux free
    linux 系统资源的查看 转载请出自出处:http://eksliang.iteye.com/blog/2167081   http://eksliang.iteye.com 一、free查看内存的使用情况 语法如下:   free [-b][-k][-m][-g] [-t] 参数含义 -b:直接输入free时,显示的单位是kb我们可以使用b(bytes),m
  • JAVA的位操作符 greemranqq 位运算JAVA位移<<>>>
    最近几种进制,加上各种位操作符,发现都比较模糊,不能完全掌握,这里就再熟悉熟悉。   1.按位操作符 :    按位操作符是用来操作基本数据类型中的单个bit,即二进制位,会对两个参数执行布尔代数运算,获得结果。    与(&)运算:    1&1 = 1, 1&0 = 0, 0&0 &
  • Web前段学习网站 ihuning Web
      Web前段学习网站 菜鸟学习:http://www.w3cschool.cc/   JQuery中文网:http://www.jquerycn.cn/   内存溢出:http://outofmemory.cn/#csdn.blog   http://www.icoolxue.com/   http://www.jikexue
  • 强强联合:FluxBB 作者加盟 Flarum justjavac r
    原文:FluxBB Joins Forces With Flarum作者:Toby Zerner译文:强强联合:FluxBB 作者加盟 Flarum译者:justjavac FluxBB 是一个快速、轻量级论坛软件,它的开发者是一名德国的 PHP 天才 Franz Liedke。FluxBB 的下一个版本(2.0)将被完全重写,并已经开发了一段时间。FluxBB 看起来非常有前途的,
  • java统计在线人数(session存储信息的) macroli javaWeb
    这篇日志是我写的第三次了 前两次都发布失败!郁闷极了!   由于在web开发中常常用到这一部分所以在此记录一下,呵呵,就到备忘录了! 我对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。 1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。 public class Ses
  • bootstrp carousel初体验 快速构建图片播放 qiaolevip 每天进步一点点学习永无止境bootstrap纵观千象
    img{ border: 1px solid white; box-shadow: 2px 2px 12px #333; _width: expression(this.width > 600 ? "600px" : this.width + "px"); _height: expression(this.width &
  • SparkSQL读取HBase数据,通过自定义外部数据源 superlxw1234 sparksparksqlsparksql读取hbasesparksql外部数据源
    关键字:SparkSQL读取HBase、SparkSQL自定义外部数据源     前面文章介绍了SparSQL通过Hive操作HBase表。   SparkSQL从1.2开始支持自定义外部数据源(External DataSource),这样就可以通过API接口来实现自己的外部数据源。这里基于Spark1.4.0,简单介绍SparkSQL自定义外部数据源,访
  • Spring Boot 1.3.0.M1发布 wiselyman spring boot
        Spring Boot 1.3.0.M1于6.12日发布,现在可以从Spring milestone repository下载。这个版本是基于Spring Framework 4.2.0.RC1,并在Spring Boot 1.2之上提供了大量的新特性improvements and new features。主要包含以下:   1.提供一个新的sprin