어떻게 자바 를 사용 하여 이 더 리 움 거래 를 보 냅 니까?

제 가 블록 체인 기술 에 대한 관심 을 표현 한 후에 우 리 는 블록 체인 에 대해 실천 을 하 게 되 었 습 니 다.특히 이 태 방 은
나 는 자바 로 사 무 를 보 내야 하기 때문에 EthereumJ 를 살 펴 보 았 다.당신 은 세 가지 선택 이 있 습 니 다:
  • 전체 노드 – 동기 화 를 사용 하면 전체 블록 체인 이 다운로드 되 었 음 을 의미 합 니 다.시간 이 많이 걸 려 서 나 는 이런 방법 을 포기 했다
  • '가 벼 운' 노드 – 동기 화 를 사용 하지 않 기 때문에 귀 하 는 네트워크 의 일부분 이 될 뿐 체인 의 그 어떠한 부분 도 가 져 오지 않 습 니 다.완전히 확정 할 수 는 없 지만 이것 은 geth 의 '경' 모드 (이 더 리 움 CLI) 에 대응 하 는 것 이 라 고 생각 합 니 다.귀 하 는 메시지 (예 를 들 어 거래 메시지) 를 다른 대등한 측 에 보 내 서 처리 하고 블록 체인 에 저장 할 수 있 습 니 다. 그러나 귀 하 는 블록 체인 이 없습니다.
  • 오프라인 (노드 없 음) – 거래 를 만 들 고 서명 하 며 원시 표시 (이 더 리 움 RLP 형식) 를 계산 한 다음 에 집중 식 API (예 를 들 어 etherscan. io API) 를 통 해 블록 체인 으로 보 냅 니 다.Etherscan 자체 가 네트워크 의 한 노드 로 모든 작업 을 수행 할 수 있 습 니 다 (따라서 대리 역할 을 합 니 다)
  • 더 소개 하기 전에 블록 체인 의 일반적인 속성 (적어도 이 더 리 움 과 유행 하 는 암호 화폐) 을 지적 할 필요 가 있 습 니 다. 이것 은 분포 식 데이터 베이스 로 누가 가지 고 있 는 대등한 네트워크 (덮어 쓰기) 에 의존 하여 클 라 이언 트 소프트웨어 (지갑 또는 기타) 를 실행 합 니 다.거래 의 형식 은 '저 (비밀 키 소유자) 가 이 금액 을 이 주소 로 보 내 기 를 원 합 니 다' 입 니 다.사 무 는 그 안에 다른 데 이 터 를 저장 할 수 있다. 예 를 들 어 그들의 의 미 를 나타 낸다.그 다음 에 거래 는 같은 업 종 에서 검증 (현재 작업량 증명 에 기반 한 공감 대 사용) 하고 블록 체인 에 저 장 됩 니 다. 이 는 모든 연결 업 체 가 새로 만 든 블록 (각 블록 은 여러 개의 거래 로 구성) 을 얻 게 된다 는 것 을 의미 합 니 다.요컨대 이것 이 바로 블록 체인 이 고 이 더 리 움 도 예 외 는 아니다.
    거래 를 왜 보 내 요?나 는 간단명료 한 용례 가 생각 나 지 않 는 다. 아마도 당신 은 기 존 지갑 보다 더 좋 은 지갑 을 실현 하고 싶 을 것 이다.예 를 들 어 저 는 제 상황 에서 해시 체인 의 머리 를 블록 체인 에 저장 해서 변경 되 지 않도록 하려 고 합 니 다.
    제 특정한 상황 에서 저 는 거래 의 일부분 으로 저 장 된 특정한 데이터 가 거래 자체 보다 더 관심 이 많 기 때문에 저 는 두 노드 가 서로 아주 작은 거래 (무 작위 로 발송 자 와 수신 자 를 선택) 를 보 냅 니 다.나 는 내 가 스마트 계약 을 통 해 이 점 을 할 수 있다 는 것 을 알 고 있 지만, 매번 한 걸음 만 필요 하 다.초기 코드 는 여기에서 찾 을 수 있 으 며, 어느 정도 EthereumJ 예제 에 기반 을 두 고 있 습 니 다.EthereumJ 는 내부 에서 spring 을 사용 하기 때문에 제 응용 프로그램 은 spring 을 사용 하기 때문에 두 노드 를 허용 하 는 데 추가 적 인 노력 을 기 울 였 습 니 다. 그러나 이것 은 주어진 임무 와 무관 합 니 다.이 코드 의 가장 중요 한 부분 은 아래 의 글 에서 더 볼 수 있 으 며, 조금 만 수정 하면 된다.
    클래스 경로 에 user.conf 파일 이 있 고 기본 값 이 있어 야 합 니 다. 이 파일 은 기본 etherumj config 를 기반 으로 할 수 있 습 니 다.더 중요 한 부분 은 외부 user 1 과 user 2 conf 파일 입 니 다.이것 은 예시 로 다음 과 같은 중요 한 매개 변 수 를 가지 고 있다.
  • peer.networkId – 실제 생산 네트워크 (= 1) 를 사용 합 니까? 테스트 네트워크 (= 3) 를 사용 합 니까?분명히 생산 외 에 당신 은 네트워크 를 테스트 해 야 합 니 다.테스트 네트워크 에서 수도 꼭 지 를 사용 하여 무료 에틸에테르 를 얻 을 수 있 습 니 다.테스트 네트워크 를 사용 하기 위해 서 는 두 개의 인자 blockchain.config.name = ropstengenesis = ropsten.json 가 있다.현재 더 많은 테스트 네트워크 가 시험 작업량 증명 에 사용 되 는 대체 방법 이 있 음 을 주의 하 십시오.
  • peer.privateKey - 이것 이 가장 중요 한 자리 입 니 다.이것 은 비밀 키 입 니 다. 블록 체인 '계 정' 을 제어 할 수 있 습 니 다.이 비밀 키 를 사용 해 야 거래 에 서명 할 수 있 습 니 다 (타원 곡선 알고리즘 사용).비밀 키 는 해당 하 는 공개 키 가 있 습 니 다. 이 공개 키 는 기본적으로 네트워크 에 있 는 주소 입 니 다. - 자금 을 보 내 려 는 사람 이 있 으 면 공개 키 로 보 냅 니 다.그러나 다른 사람 이 비밀 키 를 가지 고 있 지 않 기 때문에 귀하 만 계좌 에서 자금 을 이체 할 수 있 습 니 다.이것 은 당신 이 그것 을 보호해 야 한 다 는 것 을 의미 합 니 다.이러한 상황 에서, 그것 은 순수한 텍스트 형식 으로 파일 에 존재 합 니 다. 만약 당신 이 대량의 에틸에테르 를 사용한다 면, 이것 은 이상 적 인 선택 이 아 닐 수도 있 습 니 다.일부 키 관리 솔 루 션 사용 고려 (이와 같이)
  • peer.ip.list – 이것 은 선택 할 수 있 지만 더욱 바람 직 합 니 다 - 클 라 이언 트 를 네트워크 의 일부분 으로 유도 하기 위해 연결 할 대등한 목록 이 필요 합 니 다.그곳 의 피 어 투 피 어 노드 는 다른 피 어 투 피 어 노드 에 연결 되 어 있 습 니 다. 이 를 통 해 유추 되 기 때문에 결국은 서로 연 결 된 네트워크 입 니 다.서버 / 클 러 스 터 / 스 택 에 포트 번 호 를 사용 하려 면 포트 번호 와 결합 하여 사용 해 야 합 니 다. 다른 네트워크 설정 이 필요 합 니 다 – 포트 를 열 고 전송 과 연결 을 허용 해 야 합 니 다.
  • database.dir – 블록 체인 과 대등한 목록 이 발 견 된 디 렉 터 리 입 니 다.그것 은 leveldb 를 사 용 했 는데, 나 는 etherumj 가 유행 이 지난 leveldb 를 사 용 했 는데, 이 버 전 은 나의 기계 에서 작용 하지 않 는 다 는 것 을 발견 했다.그래서 제 가 그것들 을 제외 하고 수 동 으로 새로운 버 전 을 사 용 했 습 니 다
  • .
  • sync.enabled - 체인 을 가 져 올 지 여부 sync.enabled.보통 시간 이 많이 걸 리 기 때문에 필요 하지 않 습 니 다. 그러나 그러면 완전한 노드 가 아니 고 네트워크 에 기여 하지 않 습 니 다.

  • 앞에서 말 한 바 와 같이 나 는 완전한 노드 가 필요 없고 사 무 를 보 내 면 된다.경 형 노드 는 할 수 있 습 니 다. (차이 점 은 sync. enabled 를 true 에서 false 로 전환 하 는 것 일 뿐 입 니 다.) 그러나 처음에 대등한 노드 에 성공 한 후에 저 는 이상 한 이상 을 만 났 습 니 다. 저 는 연구 할 시간 이 없어 서 네트워크 에 가입 할 수 없습니다. (제 가 현재 사용 하고 있 는 무선 네트워크 가 너무 나 쁜 것 일 수도 있 습 니 다)
    다행스럽게도 완전히 '오프라인' 방법 이 있 습 니 다. 외부 API 를 사용 하여 거래 를 발표 합 니 다.귀하 가 해 야 할 일 은 귀하 의 비밀 키 와 라 이브 러 리 (이 예 에서 EthereumJ) 로 귀하 의 거래 를 준비 하 는 것 입 니 다.따라서 앞의 단락 에서 읽 은 모든 내용 을 잊 을 수 있 습 니 다.서명 후 RLP 인 코딩 거래 만 하면 됩 니 다.예 를 들 면:
    byte[] nonce = ByteUtil.intToBytes(getTransactionCount(senderAddress) + 1);
    byte[] gasPrice = getGasPrice();
    Transaction tx = new Transaction(
        nonce,
        gasPrice,
        ByteUtil.longToBytesNoLeadZeroes(200000),
        receiverAddress,
        ByteUtil.bigIntegerToBytes(BigInteger.valueOf(1)),  // 1 gwei
        data.getBytes(StandardCharsets.UTF_8),
        CHAIN_ID);
                
    tx.sign(ECKey.fromPrivate(senderPrivateKey));
                
    byte[] rawTx = tx.getEncoded();
                
    restTemplate.getForObject(etherscanUrl, String.class, "0x" + BaseEncoding.base16().encode(rawTx));

    이 예제 에서 저 는 Etherscan. io API 를 사용 합 니 다.거래 를 테스트 하기 위해 서 수 동 으로 표를 입력 하 십시오. (링크 는 Ropsten 테스트 네트워크 에 사 용 됩 니 다.)
    위의 매개 변 수 는 무엇 입 니까?
  • nonce – 이것 은 모든 사용자 (= 모든 비밀 키) 가 거래 하 는 시리 얼 번호 입 니 다.모든 후속 거래 는 하나의 랜 덤 수, 즉 이전 곡 + 1 의 랜 덤 수 를 가 져 야 한다.이렇게 하면 그 누구 도 같은 거래 를 재방송 하고 발송 자의 자금 을 소모 할 수 없습니다 (이미 서명 한 거래 는 무 작위 수 를 포함 하기 때문에 귀 하 는 같은 원시 거래 로 표시 하고 다시 제출 할 수 없습니다).어떻게 랜 덤 수 를 획득 합 니까?이 더 리 움 네트워크 에 연결 하면 하나 ethereum.getRepository().getNonce(fromAddress); 가 있 습 니 다.단, 연결 이 끊 긴 상태 에서 보 낸 사람의 현재 트 랜 잭 션 수 를 가 져 와 서 점차 늘 려 야 합 니 다.이것 은 eth_getTransactionCount 단점 을 통 해 완 성 된 것 이다.16 진법 으로 되 돌아 오기 때문에 해석 해 야 합 니 다. 예 를 들 어 {"jsonrpc":"2.0","result":"0x1","id":73}
  • 천연가스 가격, 최고 천연가스 가격 – 거래 비용 지불 (무료 발송 이 아 닙 니 다).당신 은 여기에서 더 많은 내용 을 읽 을 수 있 습 니 다."eth gasPrice" API 터미널 을 호출 하여 현재 휘발유 가격 을 얻 을 수 있 습 니 다.거래 때마다 가격 을 받 는 것 이 아니 라 정기 적 으로 휘발유 가격 을 받 고 캐 시 하 는 것 이 좋다.네트워크 에 연결 되 어 있 으 면 휘발유 가격 을 자동 으로 받 을 수 있 습 니 다.
  • receiverAddress – 수신 자의 공개 키 를 대표 하 는 바이트 배열
  • value – 얼마나 보 내 시 겠 습 니까?최소 단 위 는 사실상 gwei 로 이 값 은 gweis (1 ETH 의 점수) 로 지정 된다.
  • data - 업무 에 넣 을 다른 데 이 터 를 입력 하 십시오.
  • chainId – 귀하 가 사용 하 는 네트워크 와 다시 관련 이 있 습 니 다.생산 = 1, Ropsten 테스트 네트워크 = 3.왜 업무 중 에 인 코딩 을 해 야 하 는 지 궁금 하 시 면 여기 서 읽 으 실 수 있 습 니 다.

  • 그 다음 에 비밀 키 를 사용 하여 트 랜 잭 션 의 원본 표시 형식 에 서명 합 니 다 (원본 표시 형식 은 RLP (재 귀적 길이 접두사).그리고 API 로 보 냅 니 다. (이 를 위해 키 가 필요 합 니 다. Etherscan 에서 얻 고 URL 에 포함 시 킬 수 있 습 니 다.)이것 은 거의 연 결 된 작업 과 같 습 니 다.하지만 지금 은 네트워크 의 일부분 이 아니 라 중앙 방 (Etherscan) 에 의존 하고 있 습 니 다.
    그것 은 매우 간단 해 보일 수 있 습 니 다. 당신 이 그것 을 완성 하고 파악 할 때 식 은 죽 먹 기다 고 들 리 지만 세부 사항 이 너무 많아 서 아무 도 당신 에 게 서 추상 화 할 수 없 기 때문에 당신 은 먼저 전체 과정 이 거래 를 추진 할 수 있다 는 것 을 전면적으로 이해 해 야 합 니 다.랜 덤 수, chainId 가 무엇 인지, 테스트 네트워크 가 무엇 인지, 테스트 이 더 리 움 (롭 슨 수도꼭지 의 Google 최상 위 검색 결 과 를 가 져 오 는 방법 은 현재 정상적으로 실행 되 지 않 기 때문에 이 점 을 알 아야 합 니 다) 을 확인 한 다음, 이상 한 연결 문제 와 네트워크 설정 을 해결 하기 위해 체인 을 동기 화 할 지 여 부 를 확인 해 야 합 니 다.스마트 계약 도 언급 하지 않 았 다.나 는 결코 이것 이 매우 나쁘다 고 말 하 는 것 이 아니 라, 이것 은 아직 간단 하지 않다. 이것 은 광범 위 하 게 사용 되 는 장애 이다.그러나 이 는 대부분의 프로 그래 밍 에 적 용 될 수 있다.어쨌든 나 는 상기 예시 가 사람들 로 하여 금 더욱 쉽게 일 을 시작 하 게 할 수 있 기 를 바란다.
    번역https://www.javacodegeeks.com/2017/08/send-ethereum-transactions-java.html

    좋은 웹페이지 즐겨찾기