diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5d3aa2b90..366b89d20 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,7 +31,7 @@ linux-stable: - md5sum "parity_"$VER"_amd64.deb" > "parity_"$VER"_amd64.deb.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/parity --body target/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/parity.md5 --body parity.md5 @@ -98,7 +98,7 @@ linux-centos: - md5sum target/release/parity > parity.md5 - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity --body target/release/parity - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity.md5 --body parity.md5 @@ -130,7 +130,7 @@ linux-i686: - md5sum "parity_"$VER"_i386.deb" > "parity_"$VER"_i386.deb.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/i686-unknown-linux-gnu - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/parity --body target/i686-unknown-linux-gnu/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/i686-unknown-linux-gnu/parity.md5 --body parity.md5 @@ -172,7 +172,7 @@ linux-armv7: - md5sum "parity_"$VER"_armhf.deb" > "parity_"$VER"_armhf.deb.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/armv7-unknown-linux-gnueabihf - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/armv7-unknown-linux-gnueabihf/parity --body target/armv7-unknown-linux-gnueabihf/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/armv7-unknown-linux-gnueabihf/parity.md5 --body parity.md5 @@ -214,7 +214,7 @@ linux-arm: - md5sum "parity_"$VER"_armhf.deb" > "parity_"$VER"_armhf.deb.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/arm-unknown-linux-gnueabihf - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/arm-unknown-linux-gnueabihf/parity --body target/arm-unknown-linux-gnueabihf/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/arm-unknown-linux-gnueabihf/parity.md5 --body parity.md5 @@ -251,7 +251,7 @@ linux-armv6: - md5sum target/arm-unknown-linux-gnueabi/release/parity > parity.md5 - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/arm-unknown-linux-gnueabi - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/arm-unknown-linux-gnueabi/parity --body target/arm-unknown-linux-gnueabi/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/arm-unknown-linux-gnueabi/parity.md5 --body parity.md5 @@ -291,7 +291,7 @@ linux-aarch64: - md5sum "parity_"$VER"_arm64.deb" > "parity_"$VER"_arm64.deb.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/parity --body target/aarch64-unknown-linux-gnu/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/parity.md5 --body parity.md5 @@ -305,20 +305,20 @@ linux-aarch64: - target/aarch64-unknown-linux-gnu/release/parity name: "aarch64-unknown-linux-gnu_parity" allow_failure: true -linux-alpine: - stage: build - image: ethcore/rust-alpine:latest - only: - - beta - - tags - - stable - - triggers - script: - - export HOST_CC=gcc - - export HOST_CXX=g++ - - cargo build --release $CARGOFLAGS - - strip target/release/parity - - md5sum target/release/parity > parity.md5 +#linux-alpine: +# stage: build +# image: ethcore/rust-alpine:latest +# only: +# - beta +# - tags +# - stable +# - triggers +# script: +# - export HOST_CC=gcc +# - export HOST_CXX=g++ +# - cargo build --release $CARGOFLAGS +# - strip target/release/parity +# - md5sum target/release/parity > parity.md5 # - sh scripts/deb-build.sh arm64 # - cp target/aarch64-unknown-linux-gnu/release/parity deb/usr/bin/parity # - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") @@ -326,20 +326,20 @@ linux-alpine: # - md5sum "parity_"$VER"_arm64.deb" > "parity_"$VER"_arm64.deb.md5" # - aws configure set aws_access_key_id $s3_key # - aws configure set aws_secret_access_key $s3_secret -# - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi +# - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi # - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu # - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/parity --body target/aarch64-unknown-linux-gnu/release/parity # - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/parity.md5 --body parity.md5 # - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/"parity_"$VER"_arm64.deb" --body "parity_"$VER"_arm64.deb" # - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/aarch64-unknown-linux-gnu/"parity_"$VER"_arm64.deb.md5" --body "parity_"$VER"_arm64.deb.md5" - tags: - - rust - - rust-alpine +# tags: +# - rust +# - rust-alpine # artifacts: # paths: # - target/aarch64-unknown-linux-gnu/release/parity # name: "aarch64-unknown-linux-gnu_parity" - allow_failure: true +# allow_failure: true darwin: stage: build only: @@ -348,15 +348,22 @@ darwin: - stable - triggers script: + - cargo build --release -p ethstore $CARGOFLAGS - cargo build --release $CARGOFLAGS - rm -rf parity.md5 - md5sum target/release/parity > parity.md5 + - packagesbuild -v mac/Parity.pkgproj + - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") + - mv target/release/Parity\ Ethereum.pkg "parity-"$VER"-osx-installer-EXPERIMENTAL.pkg" + - md5sum "parity-"$VER"-osx-installer-EXPERIMENTAL.pkg" >> "parity-"$VER"-osx-installer-EXPERIMENTAL.pkg.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=parity-builds; fi + - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-apple-darwin - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-apple-darwin/parity --body target/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-apple-darwin/parity.md5 --body parity.md5 + - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-apple-darwin/"parity-"$VER"-osx-installer-EXPERIMENTAL.pkg" --body "parity-"$VER"-osx-installer-EXPERIMENTAL.pkg" + - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-apple-darwin/"parity-"$VER"-osx-installer-EXPERIMENTAL.pkg.md5" --body "parity-"$VER"-osx-installer-EXPERIMENTAL.pkg.md5" tags: - osx artifacts: @@ -401,11 +408,11 @@ windows: - aws configure set aws_access_key_id %s3_key% - aws configure set aws_secret_access_key %s3_secret% - echo %CI_BUILD_REF_NAME% - - if %CI_BUILD_REF_NAME% == "master" set S3_BUCKET=builds-parity-published else (set S3_BUCKET=parity-builds) - - if %CI_BUILD_REF_NAME% == "beta" set S3_BUCKET=builds-parity-published else (set S3_BUCKET=parity-builds) - - if %CI_BUILD_REF_NAME% == "stable" set S3_BUCKET=builds-parity-published else (set S3_BUCKET=parity-builds) + - echo %CI_BUILD_REF_NAME% | findstr /R "master" >nul 2>&1 && set S3_BUCKET=builds-parity-published || set S3_BUCKET=builds-parity + - echo %CI_BUILD_REF_NAME% | findstr /R "beta" >nul 2>&1 && set S3_BUCKET=builds-parity-published || set S3_BUCKET=builds-parity + - echo %CI_BUILD_REF_NAME% | findstr /R "stable" >nul 2>&1 && set S3_BUCKET=builds-parity-published || set S3_BUCKET=builds-parity - echo %S3_BUCKET% - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-pc-windows-msvc + - aws s3 rm --recursive s3://%S3_BUCKET%/%CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.exe --body target\release\parity.exe - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.exe.md5 --body target\release\parity.exe.md5 - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.zip --body target\release\parity.zip @@ -451,13 +458,13 @@ test-rust-stable: image: ethcore/rust:stable before_script: - git submodule update --init --recursive - - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF $CI_BUILD_REF@{1} | grep \.js | wc -l) + - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l) - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi script: - export RUST_BACKTRACE=1 - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; else ./test.sh $CARGOFLAGS --no-release; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"&./test.sh $CARGOFLAGS --no-release; else echo "skip rust test"&./js/scripts/lint.sh&./js/scripts/test.sh&./js/scripts/build.sh; fi tags: - rust - rust-stable @@ -468,13 +475,13 @@ test-rust-beta: image: ethcore/rust:beta before_script: - git submodule update --init --recursive - - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF $CI_BUILD_REF@{1} | grep \.js | wc -l) + - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l) - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi script: - export RUST_BACKTRACE=1 - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; else ./test.sh $CARGOFLAGS --no-release; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"&./test.sh $CARGOFLAGS --no-release; else echo "skip rust test"&./js/scripts/lint.sh&./js/scripts/test.sh&./js/scripts/build.sh; fi tags: - rust - rust-beta @@ -486,28 +493,17 @@ test-rust-nightly: image: ethcore/rust:nightly before_script: - git submodule update --init --recursive - - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF $CI_BUILD_REF@{1} | grep \.js | wc -l) + - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l) - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi script: - export RUST_BACKTRACE=1 - echo $JS_FILES_MODIFIED - - if [ -z $JS_FILES_MODIFIED ]; then echo "skip js test"; else ./test.sh $CARGOFLAGS --no-release; fi + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"&./test.sh $CARGOFLAGS --no-release; else echo "skip rust test"&./js/scripts/lint.sh&./js/scripts/test.sh&./js/scripts/build.sh; fi tags: - rust - rust-nightly allow_failure: true -js-tests: - stage: test - image: ethcore/rust:stable - before_script: - - ./js/scripts/install-deps.sh - script: - - ./js/scripts/lint.sh - - ./js/scripts/test.sh - - ./js/scripts/build.sh - tags: - - javascript-test js-release: stage: js-build only: @@ -516,9 +512,11 @@ js-release: - stable image: ethcore/rust:stable before_script: - - if [[ $NIGHTLY != "master" ]]; then ./js/scripts/install-deps.sh; fi + - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l) + - echo $JS_FILES_MODIFIED + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js build"; else ./js/scripts/install-deps.sh;fi script: - - if [[ $NIGHTLY != "master" ]]; then ./js/scripts/build.sh; fi - - if [[ $NIGHTLY != "master" ]]; then ./js/scripts/release.sh; fi + - echo $JS_FILES_MODIFIED + - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js build"; else ./js/scripts/build.sh&./js/scripts/release.sh; fi tags: - javascript diff --git a/Cargo.lock b/Cargo.lock index aa636c8ec..62ef5ea11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1263,7 +1263,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/ethcore/js-precompiled.git#55687884fd6bee1a9c34c518f8c8db8ecdda85d3" +source = "git+https://github.com/ethcore/js-precompiled.git#7cb42b0c636f76eb478c9270a1e507ac3c3ba434" dependencies = [ "parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/ethcore/res/ethereum/tests b/ethcore/res/ethereum/tests index 9028c4801..e8f4624b7 160000 --- a/ethcore/res/ethereum/tests +++ b/ethcore/res/ethereum/tests @@ -1 +1 @@ -Subproject commit 9028c4801fd39fbb71a9796979182549a24e81c8 +Subproject commit e8f4624b7f1a15c63674eecf577c7ab76c3b16be diff --git a/ethcore/src/account_provider.rs b/ethcore/src/account_provider.rs index e906aefe9..917ae8b8b 100644 --- a/ethcore/src/account_provider.rs +++ b/ethcore/src/account_provider.rs @@ -276,14 +276,20 @@ impl AccountProvider { } /// Returns `true` if the password for `account` is `password`. `false` if not. - pub fn test_password(&self, account: &Address, password: String) -> Result { - match self.sstore.sign(account, &password, &Default::default()) { + pub fn test_password(&self, account: &Address, password: &str) -> Result { + match self.sstore.sign(account, password, &Default::default()) { Ok(_) => Ok(true), Err(SSError::InvalidPassword) => Ok(false), Err(e) => Err(Error::SStore(e)), } } + /// Permanently removes an account. + pub fn kill_account(&self, account: &Address, password: &str) -> Result<(), Error> { + try!(self.sstore.remove_account(account, &password)); + Ok(()) + } + /// Changes the password of `account` from `password` to `new_password`. Fails if incorrect `password` given. pub fn change_password(&self, account: &Address, password: String, new_password: String) -> Result<(), Error> { self.sstore.change_password(account, &password, &new_password).map_err(Error::SStore) diff --git a/ethcore/src/json_tests/transaction.rs b/ethcore/src/json_tests/transaction.rs index 438852124..12e82bca2 100644 --- a/ethcore/src/json_tests/transaction.rs +++ b/ethcore/src/json_tests/transaction.rs @@ -34,7 +34,7 @@ fn do_json_test(json_data: &[u8]) -> Vec { Some(x) if x < 1_150_000 => &old_schedule, Some(_) => &new_schedule }; - let allow_network_id_of_one = number.map_or(false, |n| n >= 3_500_000); + let allow_network_id_of_one = number.map_or(false, |n| n >= 2_675_000); let rlp: Vec = test.rlp.into(); let res = UntrustedRlp::new(&rlp) diff --git a/ethcore/src/trace/db.rs b/ethcore/src/trace/db.rs index 6a1b55a1b..14129d4d9 100644 --- a/ethcore/src/trace/db.rs +++ b/ethcore/src/trace/db.rs @@ -128,6 +128,9 @@ impl TraceDB where T: DatabaseExtras { /// Creates new instance of `TraceDB`. pub fn new(config: Config, tracesdb: Arc, extras: Arc) -> Self { let mut batch = DBTransaction::new(&tracesdb); + let genesis = extras.block_hash(0) + .expect("Genesis block is always inserted upon extras db creation qed"); + batch.write(db::COL_TRACE, &genesis, &FlatBlockTraces::default()); batch.put(db::COL_TRACE, b"version", TRACE_DB_VER); tracesdb.write(batch).expect("failed to update version"); @@ -413,8 +416,12 @@ mod tests { struct NoopExtras; impl DatabaseExtras for NoopExtras { - fn block_hash(&self, _block_number: BlockNumber) -> Option { - unimplemented!(); + fn block_hash(&self, block_number: BlockNumber) -> Option { + if block_number == 0 { + Some(H256::default()) + } else { + unimplemented!() + } } fn transaction_hash(&self, _block_number: BlockNumber, _tx_position: usize) -> Option { @@ -581,35 +588,21 @@ mod tests { let db = Arc::new(Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), temp.as_str()).unwrap()); let mut config = Config::default(); config.enabled = true; - let block_0 = H256::from(0xa1); - let block_1 = H256::from(0xa2); - let tx_0 = H256::from(0xff); - let tx_1 = H256::from(0xaf); + let block_1 = H256::from(0xa1); + let block_2 = H256::from(0xa2); + let tx_1 = H256::from(0xff); + let tx_2 = H256::from(0xaf); let mut extras = Extras::default(); - extras.block_hashes.insert(0, block_0.clone()); + extras.block_hashes.insert(0, H256::default()); + extras.block_hashes.insert(1, block_1.clone()); - extras.transaction_hashes.insert(0, vec![tx_0.clone()]); + extras.block_hashes.insert(2, block_2.clone()); extras.transaction_hashes.insert(1, vec![tx_1.clone()]); + extras.transaction_hashes.insert(2, vec![tx_2.clone()]); let tracedb = TraceDB::new(config, db.clone(), Arc::new(extras)); - // import block 0 - let request = create_simple_import_request(0, block_0.clone()); - let mut batch = DBTransaction::new(&db); - tracedb.import(&mut batch, request); - db.write(batch).unwrap(); - - let filter = Filter { - range: (0..0), - from_address: AddressesFilter::from(vec![Address::from(1)]), - to_address: AddressesFilter::from(vec![]), - }; - - let traces = tracedb.filter(&filter); - assert_eq!(traces.len(), 1); - assert_eq!(traces[0], create_simple_localized_trace(0, block_0.clone(), tx_0.clone())); - // import block 1 let request = create_simple_import_request(1, block_1.clone()); let mut batch = DBTransaction::new(&db); @@ -617,38 +610,56 @@ mod tests { db.write(batch).unwrap(); let filter = Filter { - range: (0..1), + range: (1..1), + from_address: AddressesFilter::from(vec![Address::from(1)]), + to_address: AddressesFilter::from(vec![]), + }; + + let traces = tracedb.filter(&filter); + assert_eq!(traces.len(), 1); + assert_eq!(traces[0], create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); + + // import block 2 + let request = create_simple_import_request(2, block_2.clone()); + let mut batch = DBTransaction::new(&db); + tracedb.import(&mut batch, request); + db.write(batch).unwrap(); + + let filter = Filter { + range: (1..2), from_address: AddressesFilter::from(vec![Address::from(1)]), to_address: AddressesFilter::from(vec![]), }; let traces = tracedb.filter(&filter); assert_eq!(traces.len(), 2); - assert_eq!(traces[0], create_simple_localized_trace(0, block_0.clone(), tx_0.clone())); - assert_eq!(traces[1], create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); + assert_eq!(traces[0], create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); + assert_eq!(traces[1], create_simple_localized_trace(2, block_2.clone(), tx_2.clone())); - let traces = tracedb.block_traces(0).unwrap(); - assert_eq!(traces.len(), 1); - assert_eq!(traces[0], create_simple_localized_trace(0, block_0.clone(), tx_0.clone())); + assert!(tracedb.block_traces(0).is_some(), "Genesis trace should be always present."); let traces = tracedb.block_traces(1).unwrap(); assert_eq!(traces.len(), 1); assert_eq!(traces[0], create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); - assert_eq!(None, tracedb.block_traces(2)); - - let traces = tracedb.transaction_traces(0, 0).unwrap(); + let traces = tracedb.block_traces(2).unwrap(); assert_eq!(traces.len(), 1); - assert_eq!(traces[0], create_simple_localized_trace(0, block_0.clone(), tx_0.clone())); + assert_eq!(traces[0], create_simple_localized_trace(2, block_2.clone(), tx_2.clone())); + + assert_eq!(None, tracedb.block_traces(3)); let traces = tracedb.transaction_traces(1, 0).unwrap(); assert_eq!(traces.len(), 1); assert_eq!(traces[0], create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); - assert_eq!(None, tracedb.transaction_traces(1, 1)); + let traces = tracedb.transaction_traces(2, 0).unwrap(); + assert_eq!(traces.len(), 1); + assert_eq!(traces[0], create_simple_localized_trace(2, block_2.clone(), tx_2.clone())); + + assert_eq!(None, tracedb.transaction_traces(2, 1)); - assert_eq!(tracedb.trace(0, 0, vec![]).unwrap(), create_simple_localized_trace(0, block_0.clone(), tx_0.clone())); assert_eq!(tracedb.trace(1, 0, vec![]).unwrap(), create_simple_localized_trace(1, block_1.clone(), tx_1.clone())); + assert_eq!(tracedb.trace(2, 0, vec![]).unwrap(), create_simple_localized_trace(2, block_2.clone(), tx_2.clone())); } #[test] @@ -660,8 +671,10 @@ mod tests { let block_0 = H256::from(0xa1); let tx_0 = H256::from(0xff); - extras.block_hashes.insert(0, block_0.clone()); - extras.transaction_hashes.insert(0, vec![tx_0.clone()]); + extras.block_hashes.insert(0, H256::default()); + extras.transaction_hashes.insert(0, vec![]); + extras.block_hashes.insert(1, block_0.clone()); + extras.transaction_hashes.insert(1, vec![tx_0.clone()]); // set tracing on config.enabled = true; @@ -669,8 +682,8 @@ mod tests { { let tracedb = TraceDB::new(config.clone(), db.clone(), Arc::new(extras.clone())); - // import block 0 - let request = create_simple_import_request(0, block_0.clone()); + // import block 1 + let request = create_simple_import_request(1, block_0.clone()); let mut batch = DBTransaction::new(&db); tracedb.import(&mut batch, request); db.write(batch).unwrap(); @@ -678,8 +691,28 @@ mod tests { { let tracedb = TraceDB::new(config.clone(), db.clone(), Arc::new(extras)); - let traces = tracedb.transaction_traces(0, 0); - assert_eq!(traces.unwrap(), vec![create_simple_localized_trace(0, block_0, tx_0)]); + let traces = tracedb.transaction_traces(1, 0); + assert_eq!(traces.unwrap(), vec![create_simple_localized_trace(1, block_0, tx_0)]); } } + + #[test] + fn query_genesis() { + let temp = RandomTempPath::new(); + let db = new_db(temp.as_str()); + let mut config = Config::default(); + let mut extras = Extras::default(); + let block_0 = H256::from(0xa1); + + extras.block_hashes.insert(0, block_0.clone()); + extras.transaction_hashes.insert(0, vec![]); + + // set tracing on + config.enabled = true; + + let tracedb = TraceDB::new(config.clone(), db.clone(), Arc::new(extras.clone())); + let traces = tracedb.block_traces(0).unwrap(); + + assert_eq!(traces.len(), 0); + } } diff --git a/ethcore/src/types/trace_types/flat.rs b/ethcore/src/types/trace_types/flat.rs index 58983558d..d0c7cbe9b 100644 --- a/ethcore/src/types/trace_types/flat.rs +++ b/ethcore/src/types/trace_types/flat.rs @@ -119,7 +119,7 @@ impl Into> for FlatTransactionTraces { } /// Represents all traces produced by transactions in a single block. -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone, Default)] pub struct FlatBlockTraces(Vec); impl HeapSizeOf for FlatBlockTraces { diff --git a/ethstore/src/random.rs b/ethstore/src/random.rs index 1d050e422..954ec500f 100644 --- a/ethstore/src/random.rs +++ b/ethstore/src/random.rs @@ -47,7 +47,7 @@ impl Random for [u8; 32] { pub fn random_phrase(words: usize) -> String { lazy_static! { static ref WORDS: Vec = String::from_utf8_lossy(include_bytes!("../res/wordlist.txt")) - .split("\n") + .lines() .map(|s| s.to_owned()) .collect(); } @@ -55,8 +55,19 @@ pub fn random_phrase(words: usize) -> String { (0..words).map(|_| rng.choose(&WORDS).unwrap()).join(" ") } -#[test] -fn should_produce_right_number_of_words() { - let p = random_phrase(10); - assert_eq!(p.split(" ").count(), 10); -} \ No newline at end of file +#[cfg(test)] +mod tests { + use super::random_phrase; + + #[test] + fn should_produce_right_number_of_words() { + let p = random_phrase(10); + assert_eq!(p.split(" ").count(), 10); + } + + #[test] + fn should_not_include_carriage_return() { + let p = random_phrase(10); + assert!(!p.contains('\r'), "Carriage return should be trimmed."); + } +} diff --git a/js/package.json b/js/package.json index e52ce8d6e..28d2ce748 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "0.2.69", + "version": "0.2.74", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js index 55c85e4f3..80f3bc0eb 100644 --- a/js/src/api/format/input.js +++ b/js/src/api/format/input.js @@ -15,9 +15,9 @@ // along with Parity. If not, see . import BigNumber from 'bignumber.js'; -import { range } from 'lodash'; import { isArray, isHex, isInstanceOf, isString } from '../util/types'; +import { padLeft } from '../util/format'; export function inAddress (address) { // TODO: address validation if we have upper-lower addresses @@ -51,19 +51,20 @@ export function inHash (hash) { return inHex(hash); } -export function pad (input, length) { - const value = inHex(input).substr(2, length * 2); - return '0x' + value + range(length * 2 - value.length).map(() => '0').join(''); -} - export function inTopics (_topics) { let topics = (_topics || []) .filter((topic) => topic === null || topic) - .map((topic) => topic === null ? null : pad(topic, 32)); + .map((topic) => { + if (topic === null) { + return null; + } - // while (topics.length < 4) { - // topics.push(null); - // } + if (Array.isArray(topic)) { + return inTopics(topic); + } + + return padLeft(topic, 32); + }); return topics; } diff --git a/js/src/api/rpc/parity/parity.js b/js/src/api/rpc/parity/parity.js index d14cc6554..ac16eb9b0 100644 --- a/js/src/api/rpc/parity/parity.js +++ b/js/src/api/rpc/parity/parity.js @@ -123,6 +123,11 @@ export default class Parity { .then((accounts) => (accounts || []).map(outAddress)); } + killAccount (account, password) { + return this._transport + .execute('parity_killAccount', inAddress(account), password); + } + listGethAccounts () { return this._transport .execute('parity_listGethAccounts') diff --git a/js/src/api/subscriptions/personal.js b/js/src/api/subscriptions/personal.js index 58428895b..2cb0c3ea0 100644 --- a/js/src/api/subscriptions/personal.js +++ b/js/src/api/subscriptions/personal.js @@ -59,6 +59,7 @@ export default class Personal { } switch (data.method) { + case 'parity_killAccount': case 'parity_importGethAccounts': case 'personal_newAccount': case 'parity_newAccountFromPhrase': diff --git a/js/src/api/transport/error.js b/js/src/api/transport/error.js index 341839f69..6cb0dac17 100644 --- a/js/src/api/transport/error.js +++ b/js/src/api/transport/error.js @@ -36,7 +36,8 @@ export const ERROR_CODES = { REQUEST_NOT_FOUND: -32042, COMPILATION_ERROR: -32050, ENCRYPTION_ERROR: -32055, - FETCH_ERROR: -32060 + FETCH_ERROR: -32060, + INVALID_PARAMS: -32602 }; export default class TransportError extends ExtendableError { diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index c30c910e6..53600b6d3 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -79,7 +79,7 @@ export default class Ws extends JsonRpcBase { this._ws.onclose = this._onClose; this._ws.onmessage = this._onMessage; - // Get counts in dev mode + // Get counts in dev mode only if (process.env.NODE_ENV === 'development') { this._count = 0; this._lastCount = { @@ -93,8 +93,13 @@ export default class Ws extends JsonRpcBase { const s = Math.round(1000 * n / t) / 1000; if (this._debug) { - console.log('::parityWS', `speed: ${s} req/s`, `count: ${this._count}`); + console.log('::parityWS', `speed: ${s} req/s`, `count: ${this._count}`, `(+${n})`); } + + this._lastCount = { + timestamp: Date.now(), + count: this._count + }; }, 5000); window._parityWS = this; @@ -117,6 +122,7 @@ export default class Ws extends JsonRpcBase { this._connected = false; this._connecting = false; + event.timestamp = Date.now(); this._lastError = event; if (this._autoConnect) { @@ -144,6 +150,8 @@ export default class Ws extends JsonRpcBase { window.setTimeout(() => { if (this._connected) { console.error('ws:onError', event); + + event.timestamp = Date.now(); this._lastError = event; } }, 50); diff --git a/js/src/api/util/format.js b/js/src/api/util/format.js index 93f31a161..f1909748d 100644 --- a/js/src/api/util/format.js +++ b/js/src/api/util/format.js @@ -14,6 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import { range } from 'lodash'; +import { inHex } from '../format/input'; + export function bytesToHex (bytes) { return '0x' + bytes.map((b) => ('0' + b.toString(16)).slice(-2)).join(''); } @@ -33,3 +36,13 @@ export function hex2Ascii (_hex) { export function asciiToHex (string) { return '0x' + string.split('').map((s) => s.charCodeAt(0).toString(16)).join(''); } + +export function padRight (input, length) { + const value = inHex(input).substr(2, length * 2); + return '0x' + value + range(length * 2 - value.length).map(() => '0').join(''); +} + +export function padLeft (input, length) { + const value = inHex(input).substr(2, length * 2); + return '0x' + range(length * 2 - value.length).map(() => '0').join('') + value; +} diff --git a/js/src/dapps/dappreg/ButtonBar/buttonBar.js b/js/src/dapps/dappreg/ButtonBar/buttonBar.js index 289def0ea..074c527d0 100644 --- a/js/src/dapps/dappreg/ButtonBar/buttonBar.js +++ b/js/src/dapps/dappreg/ButtonBar/buttonBar.js @@ -50,12 +50,12 @@ export default class ButtonBar extends Component { key='delete' label='Delete' warning - disabled={ !this.dappsStore.currentApp.isOwner && !this.dappsStore.isContractOwner } + disabled={ !this.dappsStore.currentApp || (!this.dappsStore.currentApp.isOwner && !this.dappsStore.isContractOwner) } onClick={ this.onDeleteClick } />,