Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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 - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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 - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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 - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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 - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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 - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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); } })(); })(); GitHub - ethstorage/w3box · GitHub
Skip to content

Repository files navigation

W3Box

Introduction

W3Box is a public file hosting service based on the Web3Q chain. Anyone can upload public files without permission, and only the uploader can delete uploaded files.

W3Box can be visited here: https://web3q.io/w3box.w3q/.

How does it work

W3Box is a fully decentralized dApp which means the front-end code, back-end (smart contract) code, and users' files are all stored on the chain. The front-end contract is w3box.w3q, the backend contract is SimpleW3box and Users' files are store in file.w3q.

w3box.w3q

w3box.w3q is a w3ns domain name, which maps a contract address. The contract mapped by w3box.w3q is a FlatDirectory contract that stores w3box's website files.

FlatDirectory is the implementation of the web3 storage data contract. Click here for details.

file.w3q

file.w3q is also a w3ns domain name, and its mapped FlatDirectory contract is used to store files uploaded by users.

SimpleW3box

SimpleW3box is used to manage the file information uploaded by users.

Storage structure

contract SimpleW3box {
FlatDirectory public fileFD; // file.w3q contract
mapping(address => FilesInfo) fileInfos; // User upload file mapping
}

Upload files

function writeChunk(bytes memory fileName, bytes memory fileType, uint256 chunkId, bytes calldata data) public payable {
bytes32 nameHash = keccak256(fileName);
FilesInfo storage info = fileInfos[msg.sender];
if (info.fileIds[nameHash] == 0) {
// first
info.files.push(File(block.timestamp, name, fileType));
info.fileIds[nameHash] = info.files.length;
}
// store byte data on-chain, // because the gas fee has a maximum limit, the file is too large and needs to be split into multiple chunks for uploading
fileFD.writeChunk{value: msg.value}(getNewName(msg.sender, name), chunkId, data);
}

File Name

In file.w3q, the file is read and written by name. Adding the user address before the file name can avoid duplicate names, and the file name format is address/fileName.

function getNewName(address author,bytes memory name) public pure returns (bytes memory) {
return abi.encodePacked(Strings.toHexString(uint256(uint160(author)), 20),'/',name);
}

Read file information

The basic information of the file can be read by the user address, and the information includes upload time, name, type, and URL.

function getAuthorFiles(address author)
public view
returns (
uint256[] memory times,
bytes[] memory names,
bytes[] memory types,
string[] memory urls
)
{
uint256 length = fileInfos[author].files.length;
times = new uint256[](length);
names = new bytes[](length);
types = new bytes[](length);
urls = new string[](length);
for (uint256 i; i < length; i++) {
times[i] = fileInfos[author].files[i].time;
names[i] = fileInfos[author].files[i].name;
types[i] = fileInfos[author].files[i].fileType;
urls[i] = getUrl(getNewName(author, names[i]));
}
}

Read file content

The Web3Q gateway can read the files in the contract according to the parameters in the URL, and the server URL details are here.

function getUrl(bytes memory name) public view returns (string memory) {
return string(abi.encodePacked(
gateway,
'file.w3q/',
name
));
}

E.g., https://galileo.web3q.io/file.w3q/0xb5a0ba79d7f63571b7ba81c9ab30e8f9a72b858f/coin.png

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages