我想使用 Ethereum、Infura、web3J 开发一个 Web DApplication。你能分享你对 quickStart 的输入吗?我看到了更多的理论知识,没有找到任何使用 web3j 前进的实际例子。我想存储一个用户获得用一些元数据解决一些难题的要点,例如区块链中的积分创建日期、到期日期、难题 ID 等。
如何建模和存储上述信息..
我想使用 Ethereum、Infura、web3J 开发一个 Web DApplication。你能分享你对 quickStart 的输入吗?我看到了更多的理论知识,没有找到任何使用 web3j 前进的实际例子。我想存储一个用户获得用一些元数据解决一些难题的要点,例如区块链中的积分创建日期、到期日期、难题 ID 等。
如何建模和存储上述信息..
你的问题可以更具体一点。您确定需要与 Java 项目进行交互,或者纯粹的以太坊实现就足够了吗?
例如:如果用户在 Java 应用程序中与此拼图进行交互,但您想将用户的数据存储在区块链中,那么您需要 Web3j 与以太坊进行交互。但也许这个难题可以直接实施到区块链中。那么你根本不需要 Web3j。
首先,让我们明确一点,区块链不是比特币,比特币也不是区块链。 区块链是一个已在加密货币或数字货币中使用的概念。
Stuart Haber 和 W. Scott Stornetta于 1991 年描述了第一个关于加密保护的区块链的工作,并在 2008 年成名,当时一个不知名的人 Satoshi Nakamoto在当今最著名的加密货币之一(即比特币)中使用它。
Satoshi使用Blochchain作为网络上所有比特币交易的公共账本。比特币区块链的发明使其成为第一个无需受信任的权威机构或中央服务器即可解决双花问题的数字货币。比特币设计一直是其他应用程序的灵感 来源
四大会计师事务所中的每一家都在测试各种格式的区块链技术。安永为所有(瑞士)员工提供加密货币钱包,在其瑞士办公室安装了比特币ATM,并接受比特币作为其所有咨询服务的付款方式。
区块链,最初是区块链,是一个不断增长的记录列表,称为块,它们使用密码学进行链接和保护。块和链这两个词在中本聪的原始论文中是分开使用的,但最终在 2016 年被普及为一个词,区块链。
如果我们将区块链与链表进行比较,是的,它是一个链表,但保证了数据安全。它就像一个链表,每个节点都有三个主要组成部分:
正如我们在上图中看到的,它与 Linkedlist 非常相似,但是节点之间没有使用节点地址的链接,而是具有先前的哈希值,即先前节点的当前哈希值和当前哈希值,即先前哈希值和数据的组合。
除非链表具有完全安全的数据,因为如果我们尝试更改数据,当前的哈希值也会改变,因为一旦我们创建某些数据的哈希值,如果我们的数据相同,我们会一次又一次地获得相同的哈希值。因此,任何人都不能通过更改任何节点中的数据来作弊,因为更改数据会导致不同的哈希值,而不同的哈希值会导致无效块,因此它确保了 BlockChain 的完整性并减少了篡改旧块的机会。
区块链提供了四个重要功能:
区块链可用于参与者相互不了解的公共对等网络或参与者相互了解并相互信任的私人企业。
java
public class Block {
public int index;
public String timestamp;
public Data data;
public String hash;
public String previousHash;
}
Block类是一个包含index、timestamp、data、hash和previousHash的类。
索引:是链表中块的索引
时间戳:时间戳用于跟踪块的创建。
数据:必须存储在块中的数据。
Hash:由 data + previoushash 生成的唯一哈希码。
Previoushash:前一个区块的哈希值。
java
public Block(Data data) {
this.timeStamp = ""+new Date().getTime();
this.data = data;
}
``` java 包 com.piyush.app.blockchain; 公共类数据{
String name;
int balance;
public Data(String name,int balance){
this.name=name;
this.balance=balance;
}
@Override
public
String toString() {
return this.name+" "+this.balance;
}
}```
数据类是保存我们的数据的类,例如客户的姓名和余额。这是应该保护的数据,区块链为我们提供了安全性,即不会有数据回火。
类区块链java
public class BlockChain {
public Block generateBlock(Block block,List list) throws Exception{
try {
block.previousHash=Utils.getPreviousHash(list);
}
catch (Exception e) {
throw new Exception("previous hash null or empty");
}
String hashCode=Utils.generateHash(block);
block.setHash(hashCode);
return block;
}
}
``` java 公共类实用程序 {
public static String generateHash(Block block) {
String sha256hex = org.apache.commons.codec.digest.DigestUtils
.sha256Hex(block.previousHash + "" + block.index + "" + block.timeStamp + "" + block.data);
return sha256hex;
}
public static <E> String getPreviousHash(List<E> list) throws Exception {
if (list.size() != 0) {
Block block = (Block) list.get(list.size() - 1);
String previousHash = block.getHash();
if (previousHash != null && !previousHash.equals("")) {
return previousHash;
}
else {
throw new Exception("previous hash null or empty");
}
}
else {
return "firsthash";
}
}
public static Map isBlockChainValid(List<Block> blockChainList) throws Exception {
if (!blockChainList.isEmpty()) {
if (blockChainList.size() > 1) {
return validate(blockChainList);
}
else {
throw new Exception("block chain is empty");
}
}
else {
throw new Exception("block chain is empty");
}
}
private static Map validate(List<Block> blockChainList) {
Block current;
Block previous;
Map<String, Object> result = new HashMap();
for (int i = 1; i < blockChainList.size(); i++) {
current = blockChainList.get(i);
previous = blockChainList.get(i - 1);
if (!previous.getHash().equals(current.getPreviousHash())) {
result.put("block", blockChainList.get(i));
result.put("index", i);
}
}
return result;
}
}
```
generateHash:这是我们生成哈希的区块链的主要和最重要的部分。我们有很多可用于生成哈希的实现,但我使用了 sha256Hex。
Hash 是data+previoushash 的组合。
我们必须在下面添加一个依赖项才能获得此实现,尽管互联网上有很多 api 和其他方法可用,我们可以使用其中任何一种。
摇篮:
json
compile group: 'commons-codec', name: 'commons-codec', version: '1.11'
马文:
xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
getPreviousHash: previousHash 在区块链中也扮演着非常重要的角色,因为没有先前的哈希,我们无法创建当前的哈希,也无法将我们的区块链接在一起。
isBlockChainValid: 每当我们在区块链中添加任何块时,我们都会通过检查每个块的先前和当前哈希来检查 Blochchain 是否有效。
验证: 我们通过前一个块和数据生成块的当前散列来验证每个块,如果两者相同,则将其与已经存在的当前散列匹配,则数据ID未更改,否则数据散列已更改且块链无效。
数据更改时``` 区块链在 index2 处被更改
哈希 3cd627b352c68a2d4a3664806355a6f3fcf3d378b336380b907fcb71e41edf5f 前一个哈希 firsthash 数据 piyush1 28
哈希 1dd182aa0d8466541a97bd780571728b3169ec7a8df97c9bb526a35d2fffa8a0 前一个哈希 80430d2efe27badd4e73dd52e65893f5d8aaba87fb1f186643c12c5d7f830074 数据 piyush2
哈希 043dfeb5ea9cd0337a1d386b5b58bcf850248f84644a0b73bbfc1f762e5fe1ef 前一个哈希 3cd627b352c68a2d4a3664806355a6f3fcf3d378b336380b907fcb71e41edf5f 数据 piyush
哈希 80430d2efe27badd4e73dd52e65893f5d8aaba87fb1f186643c12c5d7f830074 前一个哈希 043dfeb5ea9cd0337a1d386b5b58bcf850248f84644a0b73bbfc1f762e5fe1ef 数据 piyush32
```
未更改数据```` 散列 33bd892bad70ff4fa7ab0f3ec648df8a40608f872337e8a8cfc8b5c8e87e1c49 前一个散列 firsthash 数据 piyush1 28
哈希 41169e01eb6160f0947640340540c246e5654c2db02223a6a44d24c016337d3a 前一个哈希 33bd892bad70ff4fa7ab0f3ec648df8a40608f872337e8a8cfc8b5yc8e87e1c49 数据pi
哈希 48441e40a3cd6384a2ce09edf3f3acefa4f18d852608fd65bc51ead861411c96 前一个哈希 41169e01eb6160f0947640340540c246e5654c2db02223a6a44d24c016337d3a 数据 pi
请通过DataAuthorisation博客了解更多关于如何防止您的数据被篡改的信息。
在区块链上找到示例项目