我想使用以太坊,Infura,web3J开发一个web DApplication ..你可以分享你对quickStart的输入,我看到更多理论上的东西&我没有找到任何实际的例子来使用web3j前进。我想用一些元数据来存储用户获得的积分来解决一些难题,比如积分创建日期,到期日期,益智ID&区块链等。
如何建模&存储以上信息..
答案 0 :(得分:0)
您可以在问题中更加具体一点。您确定需要与Java项目进行交互,还是纯粹的以太坊实现就足够了?
例如:如果用户在Java应用程序中与此谜题交互但您想将用户的数据存储在区块链中,那么您需要Web3j与以太坊进行交互。但也许拼图可以直接实现到区块链中。那么你根本不需要Web3j。
答案 1 :(得分:0)
首先,让我们清楚一点区块链不是比特币而比特币不是区块链 。 区块链是一种已用于加密货币或数字货币的概念。
关于加密安全链块的第一项工作在 1991年由Stuart Haber和W. Scott Stornetta 描述,并于2008年成名,当时一个不知名的人 Satoshi Nakamoto 在今天最着名的加密货币中使用它,即比特币。
Satoshi 使用 Blochchain 作为网络上比特币所有交易的公共分类帐。 比特币的区块链的发明使其成为第一个解决双重支出问题的数字货币,无需可信任的权威机构或中央服务器。 比特币设计一直是其他应用程序的灵感来源
四大会计师事务所中的每一家都在以各种格式测试区块链技术。恩斯特& Young向所有(瑞士)员工提供加密货币钱包,在瑞士办事处安装了比特币 ATM,并接受比特币作为其所有咨询服务的付款。
区块链,最初的区块链,是一个不断增长的记录列表,称为块,使用加密技术进行链接和保护。块和链中的单词在Satoshi Nakamoto的原始论文中单独使用,但最终在 2016 中被推广为单词 Blockchain 。
如果我们将区块链与Linkedlist进行比较,是的,它是一个链表但保证了安全数据。它就像一个Linkedlist,其中每个节点有三个主要组件:
正如我们在上图中看到的,它与Linkedlist非常相似,但是使用节点地址的节点之间没有链接,而是它有前一个哈希,它是前一个节点的当前哈希值和当前哈希值,它是前一个哈希值的组合。数据
除非链接列表具有完全安全的数据,因为如果我们尝试更改数据,当前的哈希值也会发生变化,因为如果我们创建某些数据的哈希,我们会一次又一次得到相同的哈希值,如果我们的数据相同的话。 因此,没有人可以通过更改任何节点中的数据来作弊,因为更改数据将导致不同的散列,并且不同的散列将导致invailid阻止,因此它确保了BlockChain的完整性并减少了篡改旧块的机会。
区块链提供了四个重要功能:
区块链可用于公共对等网络,参与者不会彼此了解,也不会在参与者彼此了解并相互信任的私人企业中使用。
java
public class Block {
public int index;
public String timestamp;
public Data data;
public String hash;
public String previousHash;
}
Block类是一个包含索引,时间戳,数据,哈希和previousHash的类。
索引:是链接列表中块的索引
时间戳:时间戳用于保持块的轨迹已创建
数据:必须存储在块中的数据
哈希:由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;
}
} ```
数据类是类保存我们的数据,如名称和客户的余额。这是应该从回火中获得的数据,而区块链为我们提供了不存在数据回火的安全性。
类BlockChain 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 公共类Utils {
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。
哈希是数据+ previoushash。
的组合我们必须在下面添加一个依赖项来实现这个实现,尽管互联网上有很多api和其他方法,我们可以使用其中任何一个。
<强>摇篮:强>
json
compile group: 'commons-codec', name: 'commons-codec', version: '1.11'
<强>的Maven:强>
xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
<强> getPreviousHash:强> previousHash在区块链中也起着非常重要的作用,因为如果没有先前的哈希,我们就无法创建当前哈希,也无法将我们的块链接在一起。
<强> isBlockChainValid:强> 每当我们在区块链中添加任何块时,我们通过检查每个块的先前和当前哈希来检查Blochchain是否有效。
<强>验证强> 我们通过前一个块和数据生成块的currenthash来验证每个块,如果两者相同则将它与已存在的currenthash匹配,然后数据id不被更改,否则数据哈希被更改,块链无效。
数据被更改时``` 块链在index2
处被改变hash 3cd627b352c68a2d4a3664806355a6f3fcf3d378b336380b907fcb71e41edf5f 先前的哈希firsthash 数据piyush1 28
hash 1dd182aa0d8466541a97bd780571728b3169ec7a8df97c9bb526a35d2fffa8a0 上一个哈希值80430d2efe27badd4e73dd52e65893f5d8aaba87fb1f186643c12c5d7f830074 数据piyush2 29
hash 043dfeb5ea9cd0337a1d386b5b58bcf850248f84644a0b73bbfc1f762e5fe1ef 上一个哈希3cd627b352c68a2d4a3664806355a6f3fcf3d378b336380b907fcb71e41edf5f 数据piyush2 28
hash 80430d2efe27badd4e73dd52e65893f5d8aaba87fb1f186643c12c5d7f830074 上一个哈希043dfeb5ea9cd0337a1d386b5b58bcf850248f84644a0b73bbfc1f762e5fe1ef 数据piyush3 28
```
没有数据改变```` hash 33bd892bad70ff4fa7ab0f3ec648df8a40608f872337e8a8cfc8b5c8e87e1c49 先前的哈希firsthash 数据piyush1 28
hash 41169e01eb6160f0947640340540c246e5654c2db02223a6a44d24c016337d3a 上一个哈希值33bd892bad70ff4fa7ab0f3ec648df8a40608f872337e8a8cfc8b5c8e87e1c49 数据piyush2 28
hash 48441e40a3cd6384a2ce09edf3f3acefa4f18d852608fd65bc51ead861411c96 上一个哈希41169e01eb6160f0947640340540c246e5654c2db02223a6a44d24c016337d3a 数据piyush3 28 ````
请浏览DataAuthorisation博客,详细了解如何防止数据受到限制。
查找示例项目