Bitcoin Notes

Bitcoin is a internet of money. Invented in 2008. Started in 2009

Bitcoin consists of –

  • Bitcoin Protocol – A denetralized peer-to-peer network
  • Blockchain – Public transaction ledger
  • Consensus rule – Set of rules for independent transaction validation and currency issuance
  • Proof-of-Work – Distributed computation system.

Mining– A decentralized mathematical and deterministic currency issuance. Competing to find solutions to a mathematical problem while processing bitcoin transactions (power to verify and record transactions) which is done every 10 minutes.

The mining process serves two purposes
in bitcoin:

  • Mining nodes validate all transactions by reference to bitcoin’s consensus rules.
    Therefore, mining provides security for bitcoin transactions by rejecting invalid
    or malformed transactions.
  • Mining creates new bitcoin in each block, almost like a central bank printing new
    money. The amount of bitcoin created per block is limited and diminishes with
    time, following a fixed issuance schedule

Transaction script – A decentralized transaction verification system.

Paper title – “Bitcoin: A Peer-to-Peer Electronic Cash System” written by Satoshi Nakamoto.

Fast, Secure and Borderless. Distributed, peer-to-peer system. No central server or point of control. Created through a process called as mining.

Bitcoin is completerly decentralised by design and free of any central authority or point of control that can be attacked or corrupted.

Every 10 minutes or so, Mining computers compete against thousands of similar systems in a global race to find a solution to a block of transactions. Finding such a solution, the so called Proof-of-Work (PoW)

Fixed total 21 millions coins will be created by the year 2140.

Bitcoin is virtual. User of bitcoin own keys that allow then to prove ownership stored in digital wallet.

Application Specific Integrated Circuits (ASIC)

Unverified transactions when included in a new block it is called as candidate block.

Bitcoin Improvement Proposal

Important Notes-

  • Bitcoin currency will defalte in long term as the rate of issuance will reduce and ultimately diminish.
  • Bitcoin is not a physical or digital coins. The coins are implied in transactions that can be transfered from sender to receipient.
  • Bitcoin users can transfer funds using the keys that a re stored in digital wallet/ledger. They need to sign a tranasction to unlock the value and spend it by transfering the funds. key that can sign the transactions is the only pre-requisite to spend bitcoin.

Types of wallets-

  • Desktop Wallet
  • Mobile Wallet
  • Web Wallet
  • Hardware signing devices (Harware wallet – most secure)

Full node versus lightweight

  • Full node – offers complete autonomy to its users (self governance)
  • Lightweight client. simplified-payment-verification (SPV)
  • Third-party API client

Abbrevations –

  • SPV – Simplified Payment Verification
  • NFC – Near field communication
  • POW – Proof of work
  • P2P – peer-to-peer network

Computing problems –

  • Byzantine Generals problem – consensus between various parties without a leader in distributed computing

Alogrithms-

  • proof-of-work algorithm (pow)

Setup BTCPay server in Azure

BTCPay Server is a self-hosted, open-source cryptocurrency payment processor. It’s secure, private, censorship-resistant and free.

Refer this link

Create a Resource group in Azure. I create this in West Us region.

Choose the template from the provided link and should take straight to your Azure subscription-

Enter the valid Vm Size and the supported crypto payment.

Select the Network – Mainnet, TestNet or regtest

Select the Ubuntu version. You may select the latest

Resources in Azure

This should create following resources in Azure in the selected resource group-

Navigate to BTCPayServerPublicIP resource. This should show the dns name.

This is your BTC pay admin portal.

Register Admin user

First time when you access the Btc Pay server should ask you to register a user. This user will be a owner.

Login to BTC pay server

Login with the newly created user

You will be asked to configure the lightining network and create a wallet.

Configuring the wallet and lightning network will follow in next blog along with integration with integration with commerce system such as Order Cloud.

Stay tuned to know how to configure this which should ulitmately sync the nodes as shown in below screen.

Loading

Indexing Bitcoin Transaction Database

By default Bitcoin Core builds a database containing only the transactions for the user’s wallet.

Wallet transactions can be retireved using JSON RPC API gettransaction command.

But if you want to retrieve any transaction within the node use command getrawtransaction. This command will search transactions in the index.

bitcoin.conf file set txindex

Bitcoin daemon or GUI uses conf file to load settings. On the first bitcoind run it will ask to create a config file.

Set txindex=1 in the config file before running the daemon. If the indexing is enabled the bitcoin daemon then should start synching the blocks and index.

bitcond -reindex option

If the txindex is not set in config before the first run and if later you want to index the database use -reindex option.

Re-index should take a while. To improve perfromance disable -printtoconsole option

bitcoind -reindex -rpcuser=xxxx -rpcpassword=xxxxx

bitcond -txindex option

If the txindex is not set in config before the first run and if later you want to index the database use -txindex option.

bitcoind -txindex -rpcuser=xxxx -rpcpassword=xxxxx

XM CLoud Dev – How to set background image using rendering parameters

This is a very common scenario where a background image needs to be set to certain components. Banner’s on any page on your website is a very common place to have a background image.

Note: This is not specific to XM Cloud but for any Headless implementation

Foundation Head already has an example on setting the background image using params. In this blog post will explore how this works and where in Sitecore the image can be applied. Will see how this can applied using Rendering Parameters and using OOTB _Background Image item.

Applying background image using rendering parameters

Background image can be applied to container. If you are using Foundation Head repo you can find this component OOTB.

Thre Container rendering is at following lcoation in Sitecore –

/sitecore/layout/Renderings/Feature/JSS Experience Accelerator/Page Structure/Container

Note Other properties- IsRenderingsWithDynamicPlaceholders and IsRenderingsWithDynamicPlaceholders is set to true

Rendering parameter is located – /sitecore/templates/Feature/JSS Experience Accelerator/Page Structure/Rendering Parameters/Container

Rendering paramter template has the BackgroundImage field. The background image will be set based on the image selected in this field.

How the image is set in Head

Lets see background image set in nextjs (sxastarter) Container.tsx

// image string from the rendering parameters
 let backgroundImage = props.params.BackgroundImage as string;
  let backgroundStyle: { [key: string]: string } = {};
  console.log('backgroundImage1');
  console.log(backgroundImage);
  if (backgroundImage) {
    const prefix = `${sitecoreContext.pageState !== 'normal' ? '/sitecore/shell' : ''}/-/media/`;
    backgroundImage = `${backgroundImage?.match(BACKGROUND_REG_EXP)?.pop()?.replace(/-/gi, '')}`;
    backgroundStyle = {
      backgroundImage: `url('${prefix}${backgroundImage}')`,
    };
  }

  return (
    <div className={`component container-default ${styles}`} id={id ? id : undefined}>

// style applied to <div> having background image
      <div className="component-content" style={backgroundStyle}>
        <div className="row">
          <Placeholder name={phKey} rendering={props.rendering} />
        </div>
      </div>
    </div>
  );
};

Lets see this in working in experience editor and rendering host

In the experience editor main section add a container component.

Once the rendering is added, goto “Edit component properties” and add an background image

Now you are able to see the background image applied ot container and I have added RichText in containerto show the image in background-

Rendering Host displays the image in background-

Nested containers to apply differnt background image or component

If you add only one container the image will be applied to the main section.

To resolve this you can add a container within main container. add mutiple containers as per your requirements. To set the background image to specific container in this example contianer-2 select the parent(i.e. container) and set the image by Editing the Component properties

This should apply the different images for various other sections in the sampe page and since the Container rendering has IsRenderingsWithDynamicPlaceholders property set this should create a unique Id for each container.

Here for example container-2 and container-3 is a child of container-1

Rendering Host displays banckgroung images with there respective components-

Isusue- Here you can see there is a white patch when applied to child container and the image is applied to inner div.

To resolev this apply the image to the outer div instead in container.tsx

return (
    <div className={`component container-default ${styles}`} style={backgroundStyle} id={id ? id : undefined}> // backgroundStyle added
      <div className="component-content"> // backgroundStyle removed
        <div className="row">
          <Placeholder name={phKey} rendering={props.rendering} />
        </div>
      </div>
    </div>
  );

Here you can seee a full width background image

Hope these tips helps.

Deploy Headless SXA Site to XM Cloud

In this blog blost lets create Project and Environment to deploy the sxastarter site to XM Cloud. The deployment is based on the existing repository in GitHub and have solution ready to deploy. Please see this blog posts on how to fork Foundation Head Template and setup your local instance along with creating Headless SXA Site(sxastarter) also configure the serliazation of Sitecore items.

To create project and environment you need to have access to XM Cloud either Admin or Contributor.

Login to XM Cloud

https://portal.sitecorecloud.io/

XM Cloud Organization-

Contains organization you are assigned to-

An organization is business unit either company or brand and contains team members and Sitecore Products you are subscribed and can have more than one Sitecore Product as seen in the below screen.

XM Cloud Deploy

As highlighted quick links container XM Cloud Deploy

https://deploy.sitecorecloud.io/

Deploy contanis list of projects and deployments done for each project and environments. It also container connections to GitHub or Vercel if site is hosted their.

The highlighted shows Organization name at the top and list of projects.

Connect to GitHub (Source Control Connections)

Ensure the changes (Sitecore Items) are pushed to GitHub repo.

Recommended – create separate branch for each environment. I have created dev, staging and main(prod)

Connections – should show list of all connections for projects mainly Github and Azure Devop for Source Control, while hosting connections can be mafe to Vercel. In this section we will configure GitHub provider.

Create a new GitHub connection

Should ask to login and provide access to a repository, you may choose all or specific repository-

Since I already had connection you will be shown a different option to Install and Authorize

Create Project

Click on Create project option

This should show the type of project to be created. We want to start from our own Source Code(GitHub) based on the connection made.

Since we configured only GitHub connection defaults to this Source Control-

Your connection name will be displayed here. Choose the connection. This will also show any other connections available.

You may also create a new connection from here.

Provide the project name and the repository where Foundation Head code resides along with any other changes you might have done sa a part of development.

Environment name – provide name – should be able to relate which branch is this pulled from.

Production environment – if this is then choose yes, I have selected this as no since I ma setting dev environment

Linked branch- Select the appropriate branch ensure yuo have all the changes available in this branch which you want to deploy

Trigger deployment on commit to branch – Set if this has to be auto deployed if changes are pushed to selected branch.

Deploy. This should start the deployment. This should take 10 -15 mins. Wait for the post actions.

You should now see the newly created project with dev environment-

New Project Created

New Environment Created

New Site Created (sxastarter)

Select environment and goto Sites tab-

Will see in the next blog hot to setup the Hosting

Select environment and Details tab- You should be able to see hostname, url’s and tokens along with Environment details.

Click on the Dashboard link –> Tools to see if the items are synched-

We now have templates, content and relevant items in layouts and image created

Content Editor with Site Collection, Site and Content

Templates Created

Experience Editor

Lets check the home page in experience editor

In the next bog will configure the Site hosting to Vercel.

Errors-

In connections select Create Connection –> GitHub

Click on Uninstall “Sitecore Deploy Prod”

Follow the process of creating a Connection again and this time you will see option to Install & Authorize

Once this is done an confirmed try creating a project –

Loading

Sitecore CDP- Create Guests using REST Api

https://{apiEndpoint}/v2/guests

Request to the api-

Use Client Key in User name and API Token in password to send request with Basic Auth-

Response-

Note ref field. The ref field is a guest reference which can be used further to extend or pull the guests details-

See the Properties tab to verify all the guests details-

cURL code snippet-

curl --location --request POST 'https://api.boxever.com/v2/guests' \
--header 'Authorization: Basic <<Enter Token>>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "guestType": "customer",
    "title": "Mr",
    "firstName": "Icy",
    "lastName": "Saber",
    "gender": "male",
    "dateOfBirth": "",
    "emails": [
        "icy.saber@mailfy.com"
    ],
    "phoneNumbers": [
        "01234567890"
    ],
    "nationality": "British",
    "passportNumber": "GB4B9565",
    "passportExpiry": "",
    "street": [
        "Apartment 140",
        "West Drive Avenue"
    ],
    "city": "London",
    "country": "GB",
    "postCode": "SW12",
    "state": "London"
}

C# code snippet-

var client = new RestClient("https://api.boxever.com/v2/guests");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic <<Enter Token>>");
request.AddHeader("Content-Type", "application/json");
var body = @"{
" + "\n" +
@"    ""guestType"": ""customer"",
" + "\n" +
@"    ""title"": ""Mr"",
" + "\n" +
@"    ""firstName"": ""Icy"",
" + "\n" +
@"    ""lastName"": ""Saber"",
" + "\n" +
@"    ""gender"": ""male"",
" + "\n" +
@"    ""dateOfBirth"": """",
" + "\n" +
@"    ""emails"": [
" + "\n" +
@"        ""icy.saber@mailfy.com""
" + "\n" +
@"    ],
" + "\n" +
@"    ""phoneNumbers"": [
" + "\n" +
@"        ""01234567890""
" + "\n" +
@"    ],
" + "\n" +
@"    ""nationality"": ""British"",
" + "\n" +
@"    ""passportNumber"": ""GB4B9565"",
" + "\n" +
@"    ""passportExpiry"": """",
" + "\n" +
@"    ""street"": [
" + "\n" +
@"        ""Apartment 140"",
" + "\n" +
@"        ""West Drive Avenue""
" + "\n" +
@"    ],
" + "\n" +
@"    ""city"": ""London"",
" + "\n" +
@"    ""country"": ""GB"",
" + "\n" +
@"    ""postCode"": ""SW12"",
" + "\n" +
@"    ""state"": ""London""
" + "\n" +
@"}
" + "\n" +
@"
" + "\n" +
@"";
request.AddParameter("application/json", body,  ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Python code snippet-

import http.client
import json

conn = http.client.HTTPSConnection("api.boxever.com")
payload = json.dumps({
  "guestType": "customer",
  "title": "Mr",
  "firstName": "Icy",
  "lastName": "Saber",
  "gender": "male",
  "dateOfBirth": "",
  "emails": [
    "icy.saber@mailfy.com"
  ],
  "phoneNumbers": [
    "01234567890"
  ],
  "nationality": "British",
  "passportNumber": "GB4B9565",
  "passportExpiry": "",
  "street": [
    "Apartment 140",
    "West Drive Avenue"
  ],
  "city": "London",
  "country": "GB",
  "postCode": "SW12",
  "state": "London"
})
headers = {
  'Authorization': 'Basic <Enter Token>>',
  'Content-Type': 'application/json'
}
conn.request("POST", "/v2/guests", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

Reference-

https://doc.sitecore.com/cdp/en/developers/sitecore-customer-data-platform–data-model-2-1/use-the-create-guest-function-in-sitecore-cdp-rest-api.html

https://doc.sitecore.com/cdp/en/developers/sitecore-customer-data-platform–data-model-2-1/overview-of-sitecore-cdp-rest-apis.html

https://doc.sitecore.com/cdp/en/developers/sitecore-customer-data-platform–data-model-2-1/sitecore-cdp-guest-extensions-data-model-for-rest-api.html

Loading

Sitecore CDP- Generate browser ID

The browser ID is a universally unique identifier (UUID) that Sitecore CDP assigns to every user of your application. It associates sessions, events, and orders with the respective user.

To generate browser id at server side in this case using postman use following URL-

https://{{apiEndpoint}}/{{apiVersion}}/browser/create.json?client_key={{CLIENT_KEY}}&message={}

API Endpoint

{{apiEndpoint}} – API target endpoint depends on the region client key is available in. Following are the regions and url available at the point of writing this blog and as per this document

Europe – https://api.boxever.com

Asia Pacific – https://api-ap-southeast-2-production.boxever.com

United States – https://api-us.boxever.com

See here for more details on the Sitecore CDP Rest API

API Version

API Version is v1.2

Client Key

See here for more details on How to get Client Key and API Token

Get the client key from the Sandbox/CDP & Personalise portal.

Login to portal – https://app.boxever.com/#/

Top right click the clog icon. Select API Access option

Get teh client key from this page-

Request/Response-

Status- OK. The request was served successfuly

Anantmous(Guest) should be created. Browser ID is in “ref” field in the response

Check the guest details in portal with the Browser ID-

Goto the Guests page –

Search guests with browser id. (bid: <<browser id>>)

This should the Guest Type as Visitor which means its Anonymous and not yet known or uniquely identified.

CURL code snippet-

curl --location -g --request GET 'https://api.boxever.com/v1.2/browser/create.json?client_key=<<client key>>&message={}'

C# code snippet-

var client = new RestClient("https://api.boxever.com/v1.2/browser/create.json?client_key=<<client key>>&message={}");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Python code snippet-

import http.client

conn = http.client.HTTPSConnection("api.boxever.com")
payload = ''
headers = {}
conn.request("GET", "/v1.2/browser/create.json?client_key=<<code key>>&message=%7B%7D", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

References

Preparing to integrate with Sitecore CDP

Understanding integration details

Loading

XM Cloud local environment – Configure item serialization to sync Headless SXA instance items

Synchronizing items between environments with Sitecore Serialization. The repository already contains the necessary setup for enabling serialization if you are using an official Sitecore XM Cloud foundation template.

Pre-requisite- Setup Sitecore local instance for XM Cloud development. See this blog << Blog to setup Sitecoer instance>>

You may already see the rendering host module setup in the forked repository.

This should be available in the src folder.

Lets sync the sxastarter site created earlier whilst setting up the SXA Headless Site. << Blog post to setuop SXA headless site>>.

Please note this might not be the method you want to sync the items. Ideally you should create project in XM Cloud and site created in XM Cloud environment. I am doing the other way just to demo.

Create various modules to sync your locally created site to serialize the items

This should help to push the config and items to repository and deploy to XM Cloud later.

Sync templates-

Create a scxmcloud.templates.module.json in src folder.

We are trying to serialise templates to local. These items will be searlised-

{
  "$schema": "../.sitecore/schemas/ModuleFile.schema.json",
  "namespace": "SCXMCloud.Templates",
  "items": {
    "includes": [
      {
        "name": "scxmcloud.project.templates",
        "path": "/sitecore/templates/Project",
        "allowedPushOperations": "CreateUpdateAndDelete"
      }
    ]
  }
}

scope by default is ItemAndDescendants. Hence not defined. Any new templates added here will be auto serialised. allowedPushOperations is set to CreateUpdateAndDelete. Like wise define the same for Feature and Foundation folders.

Define the same for Content (if required) or specific items, Media Library and Layout but this may be site specific.

For media I have configured following – Where scope id Single item and allowedPushOperations is CreateOnly, so these items are created only once.

{
  "$schema": "../.sitecore/schemas/ModuleFile.schema.json",
  "namespace": "SXAStarter.Media",
  "items": {
    "includes": [
      {
        "name": "scxmcloud.project.media",
        "path": "/sitecore/media library/Project/scxmcloud",
        "allowedPushOperations": "CreateOnly",
        "scope": "SingleItem"
      },
      {
        "name": "sxastarter.project.media",
        "path": "/sitecore/media library/Project/scxmcloud/sxastarter",
        "allowedPushOperations": "CreateOnly"
      }
    ]
  }
}

For Palcholder settings and Renderings- Configure same for Feature and Foundation folder.

{
  "$schema": "../.sitecore/schemas/ModuleFile.schema.json",
  "namespace": "SXAStarter.Layout",
  "items": {
    "includes": [
      {
        "name": "sxastarter.project.placeholder",
        "path": "/sitecore/layout/Placeholder Settings/Project/scxmcloud",
        "allowedPushOperations": "CreateUpdateAndDelete"
      },
      {
        "name": "sxastarter.project.renderings",
        "path": "/sitecore/layout/Renderings/Project/scxmcloud",
        "allowedPushOperations": "CreateUpdateAndDelete"
      }
    ]
  }
}

For content- I am searlising the the Site Collection and setting this as CreateOnly with scope defaulting to ItemAndDescendants

{
  "$schema": "../.sitecore/schemas/ModuleFile.schema.json",
  "namespace": "SXAStarter.Content",
  "items": {
    "includes": [
      {
        "name": "sxastarter.content",
        "path": "/sitecore/content/scxmcloud",
        "allowedPushOperations": "CreateOnly"
      }
    ]
  }
}

Finally you should have following modules depending upon the youe site requirements and configuration.

Connect the local environment

After SCS configuration you should connect to local environment. To do so use the following command

This will add the endpoint in user.json file located in .sitecore folder. Alrthough there is a default endpoint which should suffice. Provide your Sitecore instnace host name as appropriate.

dotnet sitecore connect --ref xmcloud --cm https://xmcloudcm.localhost --allow-write true -n local

Local environment should be connected and now can perform sync operations.

An entry will be added in user.json file.

Next pull the items from local Sitecore instance-

dotnet sitecore ser pull -n "local"

If you see this error – ensure the names should be unique. I did a mistake by providing same name in templates module

If you see this error ensure the items to be searialised should be repeated in any other module or any other name. You may also exclude the paths for Feature and Foundation folders – /sitecore/layout/Renderings/Feature/Experience Accelerator

/sitecore/layout/Renderings/Feature/Experience Accelerator

Finally we should have the items seraliased to the items folder-

Items are serliased to support the Home page-

Please note I have synchornised Site Collection, Site and all items of the site.

Managed to have built the home page with some images and texts.

Push these changes to the repo we forked.

Reference-

https://doc.sitecore.com/xp/en/developers/101/developer-tools/sitecore-content-serialization-configuration-reference.html

https://doc.sitecore.com/xmc/en/developers/xm-cloud/walkthrough–setting-up-your-full-stack-xm-cloud-local-development-environment.html

Next will configure Project, environment and deploy the Site to XM Cloud.

Loading

Bitcoin FAQs

How much Satoshi is 1 Bitcoin?

One Hundred Million Satoshi(Sats) is 1 Bitcoin

100000000 Satoshi = 1 Bitcoin

Satoshi to Bitcoin Conversion

SatoshiBitcoin
1 Satoshi (One)(1/100,000,000th)0.00000001 Bitcoin
10 Satoshi (Ten)0.00000010 Bitcoin
100 Satoshi (One Hundred)0.00000100 Bitcoin
1,000 Satoshi (One Thousand)0.00001000 Bitcoin
10,000 Satoshi (Ten Thousand)0.00010000 Bitcoin
100,000 Satoshi ( One Hundred Thousand)0.00100000 Bitcoin
1,000,000 Satoshi ( One Million)0.01000000 Bitcoin
10,000,000 Satoshi (Ten Million)0.10000000 Bitcoin
100,000,000 Satoshi (One Hundred Million)1.00000000 Bitcoin

How to start daemon in background?

To run Bitcoin in background as a process, start the bitcoind with daemon option.

bitcoind -daemon

Popular blockchain explorers-

Bitcoin Block Explorer

BlockCypher Explorer

blockhain.info

Bitpay Insight

mempool space

In these explorer you can search by transaction hash, address, block number and block hash

Loading

XM Cloud local environment – Access Sitecore database hosted in Docker

This blog provides details on accessing local Sitecore instance Database hosted on Docker.

If you wish to backup or share Sitecore Database you can connect to Sitecore DB.

Install Sitecore local instance, see th blog post here and run the docker containers for Sitecore.

In .env file see the SQL connection details-

Check the docker container for the DB port.

You may also see the Connection String in CM container-

  • Sitecore_ConnectionStrings_Security
  • Sitecore_ConnectionStrings_Core
  • Sitecore_ConnectionStrings_Master
  • Sitecore_ConnectionStrings_Web

From your local installed SQL server connect to docker hosted DB-

You should not able to see the DB’s configured to support Sitecore XM Cloud local instance-

Loading