Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - cita-cloud/executor_chaincode: a chaincode-compatible executor for CITA-Cloud. · GitHub
Skip to content

Repository files navigation

executor_chaincode

Build Status

executor_chaincode is an implementation of CITA-Cloud's executor.

It's compatible with fabric's chaincode with some limitations.

Users can write their smart contracts in chaincode, and run it in CITA-Cloud.

Usage

1. Executor

cargo build --release

To build docker image:

docker build -t citacloud/executor_chaincode .

You may find more details in runner_k8s and runner_consul

2. Chaincode

Build your chaincode and run it after the executor started.

You need to run a chaincode instance for each executor.

Note that some environment variables need to be set.

CORE_PEER_LOCALMSPID="Org1MSP" \
CORE_PEER_TLS_ENABLED="false" \
CORE_CHAINCODE_ID_NAME="asset-transfer-secured-agreement" \
./tradingMarbles --peer.address 127.0.0.1:7052

In fabric, some transaction can only be simulated and endorsed by peers in the same org with the client.

  • CORE_PEER_LOCALMSPID represents the org of the peer running this chaincode server.

    Due to the different executing models of transactions between CITA-Cloud and fabric, constraining a transaction to be executed in a specific executor is infeasible. So the org check in the asset-transfer-secured-agreement is removed.

  • CORE_PEER_TLS_ENABLED is not supported yet.

  • CORE_CHAINCODE_ID_NAME is the name of the chaincode.

  • --peer.address is the executor's address. Chaincode will register itself to the executor to start a bidirectional request/response stream.

You may check ./examples to see some chaincodes examples from fabric-samples.

3. Send transaction

Transaction data is the concat of chaincode_name.len().to_be_bytes()chaincode_namepayload.

Transactions in a finalized block will be executed by sending its payload to the chaincode indicated by chaincode_name.

The chaincode, as a standalone server, expect a ChaincodeMessage defined in fabric-protos/peer/chaincode_shim.proto

The detail format of the ChaincodeMessage is complicated, but its basic structure is:

ChaincodeMessage{r#type:ChaincodeMsgType::Transactionasi32,// This payload contains the function name to be called and its args.
payload,
txid,
channel_id,// signed_proposal is used to provide caller's identity and this call's private data.proposal:Some(signed_proposal),
..Default::default()}

I write a library for building and sending this kind of transaction.

Limitations

1. Private data and organization check

Since transactions are executed equally on every peers, organization check that verify peer and client org match will fail, and private data attached to the transaction will be sent to and stored by every peers.

2. Channel

Channel is not supported yet. Users may run multiple CITA-Cloud instances to simulate channel.

3. Pagination

Paginated queries are not supported yet. Queries will return full results at once.

4. Invoke other chaincodes

Invoking other chaincodes is not supported yet.

5. DB specified queries

ctx.GetStub().GetQueryResult(queryString)

This kind of DB specified queries is not supported yet.

About

a chaincode-compatible executor for CITA-Cloud.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages